2013-08-08 2 views
0

J'écris un client FUSE en utilisant python-fuse.Python: Test de bits par rapport à des constantes définies

L'une des fonctions qui nécessite une écriture imite la fonction Python os.open() et j'ai besoin de tester l'argument flags.

Il est facile de créer un tel argument, en utilisant le OU binaire, pour combiner les constantes os.O_*.

Mais je n'arrive pas à comprendre comment tester si des paramètres spécifiques sont définis.

ont vu

if flags | os.O_APPEND: 
    ... 

dans l'exemple xmp.py, qui ne peut pas comprendre si c'est vrai. Test-t-il si les indicateurs APPEND sont définis dans flag? Ignore si les autres indicateurs sont définis?

J'essaie

if not (flags | os.O_RDONLY): 

et il ne semble pas fonctionner.

Certainement un python noob.

+0

Cet exemple ne fonctionne pas et est trompeur. il doit être &, de sorte que l'indicateur O_APPEND joue le rôle de masque. – njzk2

Répondre

1

test en masquant avec &:

if flags & os.O_APPEND: 

| est utilisé pour combiner drapeaux, utilisez & (au niveau du bit) pour tester si un indicateur est défini. La ligne if flags | os.O_APPEND est probablement une erreur dans l'exemple xmp.py, il est toujours va être True.

Démo:

>>> 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 

Parce que numérique 0 est faux et toute autre valeur numérique est vrai, 8 est considéré comme vrai.

Notez que os.O_RDONLY est 0; c'est l'équivalent de ne pas avoir défini des drapeaux. Vous pouvez le tester explicitement (if not flags ou if flags == os.O_RDONLY), ou déduire des tests pour les autres indicateurs.

+0

Le seul problème avec ceci est que 'os.O_RDONLY' est' 0' donc '&' -ing sera toujours faux. Celui-là devrait être fait un cas spécial. –

+0

@ViktorKerkez: Oui, car cela équivaut à ne pas avoir spécifié de drapeau du tout. –

+0

@Markijn: Merci, ça a du sens! Savait que ça devait être quelque chose de simple! Question suivante idiote ... Je suppose que 'if (flags & os.O_APPEND) == 0:' est probablement préférable d'inverser le test? – barryhunter

Questions connexes