2017-06-15 1 views
0

ici est le plus simple script python, du nom comme test.pypython3: pourquoi dans argparse, un 'Vrai' est toujours 'Vrai'?

import argparse 

parser = argparse.ArgumentParser() 
parser.add_argument('--bool', default=True, type=bool, help='Bool type') 
args = parser.parse_args() 
print(args.bool) 

Mais quand je lance ce code dans la ligne de commande:

python test.py --bool False 
True 

alors que lorsque '-bool' defalut = False dans mon code, les choses semblent bien, l'argparse fonctionne correctement.

Pourquoi?

Merci beaucoup.

Répondre

6

Vous ne passez pas dans l'objet False. Vous passez dans la chaîne 'False', et c'est une chaîne de longueur non nulle.

Seule une chaîne de longueur 0 essais comme faux:

>>> bool('') 
False 
>>> bool('Any other string is True') 
True 
>>> bool('False') # this includes the string 'False' 
True 

Utilisez un store_true or store_false action à la place. Pour default=True, utilisez store_false:

parser.add_argument('--bool', default=True, action='store_false', help='Bool type') 

Maintenant, en omettant le commutateur règle args.bool-True, en utilisant --bool (sans argument supplémentaire) définit args.bool-False:

python test.py 
True 

python test.py --bool 
False 

Si vous doit analyser une chaîne avec True ou False, vous devrez le faire explicitement:

def boolean_string(s): 
    if s not in {'False', 'True'}: 
     raise ValueError('Not a valid boolean string') 
    return s == 'True' 

et l'utiliser comme argument de conversion:

parser.add_argument('--bool', default=True, type=boolean_string, help='Bool type') 

à quel point --bool False fonctionnera comme vous attendez.