Il semble y avoir une certaine confusion quant à ce qu' type=bool
et type='bool'
peut signifier. Si l'un (ou les deux) signifie 'exécution de la fonction bool()
, ou de "retourner un booléen'? Comme il est type='bool'
ne signifie rien. add_argument
donne un 'bool' is not callable
d'erreur, de même que si vous utilisiez type='foobar'
ou type='int'
.
Mais argparse
n'ont de registre qui vous permet de définir des mots-clés comme ceci. Il est principalement utilisé pour l' action
, par exemple `action='store_true'. Vous pouvez voir les mots clés:
parser._registries
qui affiche un dictionnaire
{'action': {None: argparse._StoreAction,
'append': argparse._AppendAction,
'append_const': argparse._AppendConstAction,
...
'type': {None: <function argparse.identity>}}
Il y a beaucoup d'actions définies, mais d'un seul type, celui par défaut, argparse.identity
.
Ce code définit une 'bool' mot-clé:
def str2bool(v):
#susendberg's function
return v.lower() in ("yes", "true", "t", "1")
p = argparse.ArgumentParser()
p.register('type','bool',str2bool) # add type keyword to registries
p.add_argument('-b',type='bool') # do not use 'type=bool'
# p.add_argument('-b',type=str2bool) # works just as well
p.parse_args('-b false'.split())
Namespace(b=False)
parser.register()
n'est pas documentée, mais aussi de ne pas cachés. Pour la plupart, le programmeur n'a pas besoin de le savoir, car type
et action
prendre la fonction et les valeurs de classe. Il y a beaucoup de stackoverflow exemples de définition des valeurs personnalisées pour les deux.
Dans le cas où il n'est pas évident à partir de la discussion précédente, en bool()
ne signifie pas "analyser une chaîne de caractères". À partir de la documentation Python:
bool(x): permet de Convertir une valeur d'un Booléen, à l'aide de la norme de la vérité, la procédure d'essai.
Cela contraste avec la
int(x): convertit un nombre ou une chaîne de x à l'entier inférieur.