'〜'(代字号)运算符在Python中的应用

Ale*_*lec 17 python bit-manipulation operator-overloading tilde python-3.x

我刚刚发现的位补元运算通过在Python 这个问题,并一直在努力来为它的实际应用中,如果没有,以确定它是否是普遍安全的重载操作(通过重写__invert__方法)用于其他用途.问题中给出的示例失败了TypeError,并且提供的链接看起来非常令人生畏.这里有一些摆弄~使用:

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)
Run Code Online (Sandbox Code Playgroud)

是否有任何针对该运营商,我应该知道的有效使用情况的例子吗?即使有,除了int?之外的类型覆盖此运算符通常是否可以接受?

pok*_*oke 13

该标准使用情况的按位NOT运算符是位操作,就像位与&,按位或|,按位异或^,和位移<<>>.虽然它们很少用于更高级别的应用程序,但有时候你需要进行逐位操作,这就是它们存在的原因.

当然,您可以为自定义类型覆盖这些,并且通常在执行此操作时不需要遵循任何特定语义.只需选择对您的类型有意义的内容以及以某种方式仍适合运营商的内容.

如果操作模糊不清并且用一两个字更好地解释,那么您应该使用标准方法.但是在某些情况下,特别是在使用与数字相关的类型时,可能会有一些类似于数学的操作,这些操作适合按位运算符,因此可以使用它们.

就像你将覆盖标准运算符一样+,-仅仅为了有意义的运算,你应该尝试对按位运算符执行相同的操作.


之所以~~True, ~~False给你(1, 0)是因为bool类型不定义自己的__invert__操作.但是,int确实如此; 而bool实际上是一个亚型int.所以bool实际上继承了所有按位和算术运算符的逻辑.这就是为什么True + True == 2等等.


Ult*_*nct 6

我应该注意这个操作符的有效用例的例子吗?即使有,对于int以外的类型覆盖此运算符通常是可以接受的吗?

通常,您不希望~因为它很有趣而使运算符过载.这使阅读变得困难.但有时,除了int有意义之外的其他类型的重载.看看SQLAlchemy如何充分利用它.

  • 它是一个`NOT`运算符,而不是`NOT IN`运算符. (3认同)