我有这组常量声明
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
检查值是否与任何输入状态(4,512和1024)匹配的pythonic方法是什么? 额外信息:我通常只是在更简单的语言中使用位模式检查,但我想知道在Python中是否有更好的方法:) 基本上,每个引脚都可以具有上述I / O状态之一,但如果引脚是任何输入值,则会发生一个动作 例如,如果pin == 4或512或1024 - >做点什么
答案 0 :(得分: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
答案 1 :(得分:4)
最好使用set
来测试集合成员资格(您似乎正在做的事情)。
self.input_states = {self.PINPUT, self.PINPUTDOWN, self.PINPUTNONE}
# later
if value in self.input_states:
do_something()
当然,您可以通过各种基本相同的方式来处理这个问题,但不管怎样,您必须对这些魔术数字中的哪些是“输入状态”进行编码。
现在,如果按照建议,你真正想要的是根据是否设置某个位进行一些位掩码或测试,那么你想看一下Python bitwise operators。特别是,要查看某个值是否等于您在那里得到的值之一,您将使用按位,并在Python中用&
表示。 Joran's answer很好地涵盖了这种用法,但基本思路是:
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()