Python:对定义的常量进行位测试

时间:2013-08-08 16:32:43

标签: python bit-manipulation

我正在使用python-fuse编写FUSE客户端。

需要编写的函数之一,模仿Python os.open()函数,我需要测试flags参数。

通过使用按位OR来组合os.O_*常量很容易创建这样的参数。

但我无法弄清楚如何测试特定的设置。

见过

if flags | os.O_APPEND:
     ...
在xmp.py示例中的

,无法确定是否正确。是否测试APPEND标志是否设置在标志中?忽略是否​​设置了其他标志?

我在尝试

if not (flags | os.O_RDONLY):

它似乎不起作用。

绝对是一个蟒蛇菜鸟。

1 个答案:

答案 0 :(得分:1)

使用&屏蔽进行测试:

if flags & os.O_APPEND:

|用于组合标志,使用&(按位AND)来测试是否设置了标志。 if flags | os.O_APPEND行中的xmp.py行很可能是错误,总是将成为True

演示:

>>> import os
>>> 0 & os.O_APPEND
0
>>> os.O_APPEND & os.O_APPEND
8
>>> (os.O_RDWR | os.O_CREAT) & os.O_APPEND
0
>>> (os.O_RDWR | os.O_CREAT | os.O_APPEND) & os.O_APPEND
8

因为数字0为假且任何其他数值为真,所以8被视为真。

请注意,os.O_RDONLY0;它相当于没有设置任何标志。您可以明确地测试它(if not flagsif flags == os.O_RDONLY),或者从其他标志的测试中推断它。