“~”(波浪号)运算符在 Python 中的应用

新手上路,请多包涵

我刚刚通过 这个问题 发现了 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)

是否有 任何 我应该注意的此运算符的有效用例示例?即使有,对于 int 以外的类型覆盖此运算符通常是否可以接受?

原文由 Alec 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.5k
2 个回答

按位非运算符的标准用例是按位运算,就像按位与 & ,按位或 | ,按位异或 ^ , and bitfad-e60457移动 <<>> 。尽管它们很少用于更高级别的应用程序,但有时您仍然需要进行按位操作,因此这就是它们存在的原因。

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

如果该操作晦涩难懂,用一两个词更好地解释,那么您应该改用标准方法。但是在某些情况下,尤其是在处理与数字相关的类型时,可能会有一些适合按位运算符的类似数学的运算,因此可以很好地使用它们。

就像你会覆盖标准运算符一样 +- 只是为了有意义的操作,你应该尝试对按位运算符做同样的事情。


The reason ~~True, ~~False gives you (1, 0) is because the bool type does not define its own __invert__ operation.但是, int 可以;和 bool 实际上是 int 的子类型。所以 bool 实际上继承了所有按位和算术运算符的逻辑。这就是为什么 True + True == 2 等等。

原文由 poke 发布,翻译遵循 CC BY-SA 3.0 许可协议

是否有任何我应该注意的此运算符的有效用例示例?即使有,对于 int 以外的类型覆盖此运算符通常是否可以接受?

通常,您不会仅仅因为有趣就重载 ~ 运算符。这使阅读变得困难。但有时,除了 int 之外的类型的这种重载是有道理的。 看看 SQLAlchemy 如何很好地利用它。

原文由 UltraInstinct 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题