__invert__ 方法

ITA*_*ITA 1 python python-3.x

__invert__方法的目的是什么?我在探索 Python 内部结构时遇到了:

>>> dir(__builtins__.int)
['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__', '__init__', '__init_subclass__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']
Run Code Online (Sandbox Code Playgroud)

令我惊讶的是:

__builtins__.int().__invert__()
Run Code Online (Sandbox Code Playgroud)

这似乎打破了所有数学规则,因为__builtins__.int()返回零,我们都知道你不能反转那个整数。也许我遗漏了一些东西......所以我深入研究了文档,发现__invert__相当于按位不。

  1. 为什么以及如何将对象的倒数定义为其按位倒数而不是更具语义意义的东西,非零有理数的倒数是它的倒数,零没有一个,复数采取不同的策略,方法的倒数反转状态或未定义等。

    有人可以举一个例子,说明在高级别的(即不是在编译器/解释器优化级别)采用类/对象实例的按位非是一种有用的构造的情况。

  2. Python 文档说明对象的类型返回对象本身,那么为什么我们不能将零反转定义为 None 或 NaN 对象呢?

Ant*_*ile 6

__invert__ 是“二元非”运算符的实现 ~——它与数学中“反转”这个词的任何正式定义完全无关

对于整数 0,使用 2s 补码,二进制取反0b000...0000b111...111-- 或-1十进制

>>> ~int()
-1
>>> int().__invert__()
-1
>>> ~0
-1
Run Code Online (Sandbox Code Playgroud)