`operator.__inv__`是用来做什么的?

3

invinvert有何区别?

>>> import operator
>>> operator.inv is operator.invert
False
>>> operator.__inv__ is operator.__invert__
False

据我了解,__invert__ 是一元操作符的钩子,例如 ~1 或者 (1).__invert__()

但是另一个 __inv__ 是什么对应的呢?如果它与前者相同,为什么我们要添加另一个名称和不同的函数来完成相同的事情呢?


根据文档,“inv”,“invert”,“__inv__”和“__invert__”都是相同的运算符。但这并不意味着它们是相同的函数。 - Some programmer dude
根据文档,它们代表着相同的运算符。但这并不意味着它们必须是同一个对象。 - MisterMiyagi
1个回答

1
两者都表示相同的运算符。长拼写在Python 2.0中添加,而短拼写从未被删除。
operator.inv(obj)
operator.invert(obj)
operator.__inv__(obj)
operator.__invert__(obj)
返回数字 obj 的按位反转。 这等同于〜obj
新版本功能(2.0):名称invert()__invert__()
来源:{{link1:Python 2 operator documentation}}。
这些被实现为不同的对象,因为它们的表示反映了名称。请注意,相应的dunder和常规名称确实共享相同的表示和对象。
>>> operator.__inv__
<built-in function inv>
>>> operator.__invert__
<built-in function invert>
>>> operator.__inv__ is operator.inv
True
>>> operator.__invert__ is operator.invert
True

历史上,这两个名称都是同样可行的 - Python 1 operator模块使用了inv/__inv__名称,而Python 1 数据模型使用了特殊方法__invert__名称。


2
好的,但这并没有真正回答我的问题。为什么__inv__会出现在那里,当它并不对应任何魔法方法?如果它们是相同的,那么为什么它们有不同的实现,而不只是名称别名呢? - X Æ A-Xiii
@XÆA-13 这是给你的。 - MisterMiyagi
我认为名称参数并不太令人信服,因为例如 IOError.__name__ 是 "OSError"。 - X Æ A-Xiii
请原谅,这是一个技术事实,而不是一个论点。IOError被表示为<class 'OSError'>。运算符被选择以不同的方式表示,错误没有。需要单独实现还是不需要直接取决于这个选择。 - MisterMiyagi
我的意思是,__name__ 属性与对象绑定的名称完全对应并不是非常重要。为什么会有两个不同实现的相同函数在内存中存在呢?也许在早期版本的 Python 中存在一些钩子 __inv__ 吗?他们不仅仅添加例如 __neg____negative__ 以提供额外的便利。 - X Æ A-Xiii
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接