检查位值的Pythonic方式
我有一组常量的声明
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()