“~”(颚化符)运算符在Python中的应用

2024-09-28 03:13:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我刚刚通过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以外的类型重写此运算符通常可以接受吗?


Tags: 应用程序binassertthisoperationlengthintbool
3条回答

按位NOT运算符的标准用例是按位操作,就像按位和&、按位或|、按位异或^、按位移位<<>>。虽然它们很少用于更高级别的应用程序,但有时仍需要进行按位操作,所以这就是它们存在的原因。

当然,您可以为自定义类型覆盖这些类型,一般来说,这样做时不需要遵循任何特定的语义。只需选择对您的类型有意义的内容,以及在某种程度上仍然适合操作员的内容。

如果操作不清楚,并且用一两个词更好地解释,则应使用标准方法。但是,在某些情况下,特别是在处理与数字相关的类型时,可能会有一些类似数学的操作适合按位运算符,因此可以使用这些操作。

就像覆盖标准运算符(如+-)仅用于有意义的操作一样,应该尝试对按位运算符执行相同的操作。


~~True, ~~False给出(1, 0)的原因是bool类型没有定义自己的__invert__操作。然而,int确实如此,bool实际上是int的一个子类型。因此bool实际上继承了所有位运算符和算术运算符的逻辑。这就是为什么True + True == 2

可以将该运算符与求反运算符(-)结合使用,将数字增加1。例如:

x = 5
assert -~x == 6

这是我使用~运算符的唯一实用方法。除数字外,它还可以用于任何其他用途,通常依赖于上下文,并且通常会增加理解代码的复杂性。 对于C++、SWIFT、Ruby等语言,可以将这个操作符重载为任何东西,有时会使代码很难快速消化

Are there any examples of valid use-cases for this operator that I should be aware of? And even if there are, is it generally acceptable to override this operator for types other than int?

通常,您不想仅仅因为~操作符有趣就重载它。这使阅读困难。但有时,对于int以外的类型,这样的重载是有意义的。Take a look at how SQLAlchemy puts it to good use.

相关问题 更多 >

    热门问题