我刚刚通过this question发现了Python中的bitwise complement unary operation,并一直在尝试为它设计一个实际的应用程序,如果不是,则确定重载操作符(通过重写__invert__
方法)以用于其他用途是否通常是安全的。问题中给出的示例使用TypeError
失败,并且提供的link看起来相当吓人。这里有一些摆弄来查看使用中的~
:
from bitstring import BitArray
x = 7
print(~x)
# -8
print(BitArray(int=x, length=4).bin)
# '0111'
print(BitArray(int=~x, length=4).bin)
# '1000'
print(~~True, ~~False)
# 1 0
for i in range(-100, 100):
assert i + ~i == -1
assert i ^ ~i == -1
assert bool(i) == ~~bool(i)
是否有任何我应该知道的关于这个操作符的有效用例的例子?即使存在,对于int
以外的类型重写此运算符通常可以接受吗?
按位NOT运算符的标准用例是按位操作,就像按位和
&
、按位或|
、按位异或^
、按位移位<<
和>>
。虽然它们很少用于更高级别的应用程序,但有时仍需要进行按位操作,所以这就是它们存在的原因。当然,您可以为自定义类型覆盖这些类型,一般来说,这样做时不需要遵循任何特定的语义。只需选择对您的类型有意义的内容,以及在某种程度上仍然适合操作员的内容。
如果操作不清楚,并且用一两个词更好地解释,则应使用标准方法。但是,在某些情况下,特别是在处理与数字相关的类型时,可能会有一些类似数学的操作适合按位运算符,因此可以使用这些操作。
就像覆盖标准运算符(如
+
和-
)仅用于有意义的操作一样,应该尝试对按位运算符执行相同的操作。~~True, ~~False
给出(1, 0)
的原因是bool
类型没有定义自己的__invert__
操作。然而,int
确实如此,bool
实际上是int
的一个子类型。因此bool
实际上继承了所有位运算符和算术运算符的逻辑。这就是为什么True + True == 2
等可以将该运算符与求反运算符(
-
)结合使用,将数字增加1。例如:这是我使用
~
运算符的唯一实用方法。除数字外,它还可以用于任何其他用途,通常依赖于上下文,并且通常会增加理解代码的复杂性。 对于C++、SWIFT、Ruby等语言,可以将这个操作符重载为任何东西,有时会使代码很难快速消化通常,您不想仅仅因为
~
操作符有趣就重载它。这使阅读困难。但有时,对于int
以外的类型,这样的重载是有意义的。Take a look at how SQLAlchemy puts it to good use.相关问题 更多 >
编程相关推荐