J'utilise le code simple suivant pour analyser certains arguments; notez que l'un d'eux est obligatoire. Malheureusement, lorsque l'utilisateur exécute le script sans fournir l'argument, le texte d'utilisation / d'aide affiché n'indique pas qu'il existe un argument non facultatif, ce que je trouve très déroutant. Comment puis-je obtenir python pour indiquer qu'un argument n'est pas facultatif?
Voici le code:
import argparse
if __name__ == '__main__':
parser = argparse.ArgumentParser(
description='Foo')
parser.add_argument('-i','--input', help='Input file name', required=True)
parser.add_argument('-o','--output', help='Output file name', default="stdout")
args = parser.parse_args()
print ("Input file: %s" % args.input )
print ("Output file: %s" % args.output )
Lors de l'exécution du code ci-dessus sans fournir l'argument requis, j'obtiens la sortie suivante:
usage: foo.py [-h] -i INPUT [-o OUTPUT]
Foo
optional arguments:
-h, --help show this help message and exit
-i INPUT, --input INPUT
Input file name
-o OUTPUT, --output OUTPUT
Output file name
-i INPUT
pièce n'est pas entourée de crochets, ce qui indique que la subtilité est effectivement requise. En outre, vous pouvez expliquer manuellement cela via lehelp
paramoptional arguments
aux arguments requis est toujours trompeur.Réponses:
Les paramètres commençant par
-
ou--
sont généralement considérés comme facultatifs. Tous les autres paramètres sont des paramètres positionnels et en tant que tels requis par la conception (comme les arguments des fonctions positionnelles). Il est possible d'exiger des arguments facultatifs, mais c'est un peu contraire à leur conception. Puisqu'ils font toujours partie des arguments non positionnels, ils seront toujours répertoriés sous l'en-tête déroutant «arguments facultatifs» même s'ils sont requis. Les crochets manquants dans la partie utilisation montrent cependant qu'ils sont effectivement nécessaires.Voir aussi la documentation :
Cela étant dit, les en-têtes «arguments positionnels» et «arguments facultatifs» dans l'aide sont générés par deux groupes d'arguments dans lesquels les arguments sont automatiquement séparés. Maintenant, vous pouvez "pirater" et changer le nom des options, mais une solution beaucoup plus élégante serait de créer un autre groupe pour "les arguments nommés requis" (ou ce que vous voulez les appeler):
la source
parser.parse_args([])
utilisez plutôtparser.parse_args()
sans arguments pour capturer le contenu de sys.argv. Per argparseComme je préfère lister les arguments requis avant facultatif, je le pirate via:
et cela donne:
Je peux vivre sans que «l'aide» apparaisse dans le groupe d'arguments optionnels.
la source
Construire hors de @Karl Rosaen
et cela donne:
la source
_action_group
sans accéder au membre protégé? Dans mon cas, je dois ajouter un argument à un groupe (personnalisé) déjà existant.Encore une fois, en partant de @RalphyZ
Celui-ci ne casse pas l'API exposée.
Qui affichera la même chose que ci-dessus et devrait survivre aux futures versions:
la source
_action_groups
est destiné à un usage interne uniquement. Par conséquent, il n'y a aucune garantie de compatibilité entre les versions.