Pythonic检查位值的方法

时间:2014-03-19 21:27:36

标签: python python-2.7 flags

我有这组常量声明

    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 - >做点什么

2 个答案:

答案 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()