假设我构建了一个包含 Foo 类的库,支持一些神奇的方法,比如 __add__()__radd__() :

>>> class Foo(object): 
...     def __add__(self, rhs): 
...         print("Foo.__add__", rhs) 
...     def __radd__(self, lhs): 
...         print("Foo.__radd__", lhs) 
...  
>>> foo = Foo() 
>>> foo + 3 
Foo.__add__ 3 
>>> 3 + foo 
Foo.__radd__ 3 

当计算 3 + foo 时,python 首先调用 type(3).__add__(3, foo),但返回 NotImplemented , 它回落到 type(foo).__radd__(foo, 3):

>>> type(3).__add__(3, foo) 
NotImplemented 

我希望开发人员能够在我的库之上构建库,比如包含类 Bar 的库,并且我希望他们拥有完全控制权。特别是,我想实现一些机制,让其他库决定 foo + bar 是否应该调用 foo.__add__(bar)bar.__radd__(foo )

我看到 NumPy 使用 __array_priority__ 方案解决了这个问题。但这似乎引起了一些头痛(考虑到关于此的问题和问题的数量)。还有其他最佳做法吗?

请您参考如下方法:

一个流行的选择是维护 LHS 支持的类型列表,如果 RHS 的类型不在列表中,则返回 NotImplemented:

class Foo(object): 
    SUPPORTED_TYPES = (int, Foo) 
    def __add__(self, rhs): 
        if isinstance(type(rhs), SUPPORTED_TYPES): 
            [...] # compute self + rhs 
        else: 
            return NotImplemented 

除非 rhsSUPPORTED_TYPES 之一的智能子类型,否则它会很好地工作:它无法获得控制权。 此外,以这种方式列出类型不是很灵活。依赖鸭子类型可能比依赖硬编码类型列表更好。


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!

python - 在 python 中以相反的顺序柯里化(Currying)