检查位值的Pythonic方式

0 投票
2 回答
1331 浏览
提问于 2025-04-17 23:02

我有一组常量的声明

    self.POUTPUT = 1
    self.PPWM = 2
    self.PINPUT = 4
    self.PUNUSED = 8
    self.PSONAR = 16
    self.PULTRA = 32
    self.PSERVOD = 64
    self.PSTEPPER = 128
    self.PCOUNT = 256
    self.PINPUTDOWN = 512
    self.PINPUTNONE = 1024

请问在Python中,检查一个值是否与输入状态(4、512和1024)中的任何一个匹配的最佳方法是什么?
补充信息:我通常在更简单的语言中使用位模式检查,但我想知道在Python中是否有更好的方法 :)
基本上,每个引脚可以有上述的I/O状态,但如果一个引脚是任何一个输入值,就会发生一个动作。
比如说,如果引脚等于4或者512或者1024,就执行某个操作。

2 个回答

5
if SOME_DATA & self.PINPUTNONE:  # do somethign

这就是人们通常的做法

为了检查很多东西

ANY = self.POUTPUT | self.PPWM | self.PINPUT | self.PUNUSED |  self.PSONAR  ...
if some_data & ANY: #do something
4

检查一个值是否在某个集合中(这就是你似乎在做的事情)最好的方法是使用一个 set

self.input_states = {self.PINPUT, self.PINPUTDOWN, self.PINPUTNONE}

# later
if value in self.input_states:
    do_something()

当然,你可以用很多基本上相同的方法来处理这个问题,但无论如何,你都得知道哪些神奇的数字是“输入状态”。


现在,如果如之前所说的,你实际上想做的是一些位掩码操作或者测试某个特定位是否被设置,那么你需要看看 Python 的位运算符。特别是,如果你想检查一个值是否等于你那里的某个值,你会使用位与运算符,在 Python 中用 & 表示。Joran 的回答很好地解释了这个用法,但基本的想法是:

if value & self.PINPUT: # Value has a 1 in the PINPUT bit (bit 3)
    do_something()

或者如果所有这些输入值触发相同的动作:

if any(value & p for p in (self.PINPUT, self.PINPUTDOWN, self.PINPUTNONE)):
    do_something()

撰写回答