web-dev-qa-db-fra.com

Utilisation de 'argparse.ArgumentError' dans Python

Je voudrais utiliser l'exception ArgumentError dans le module argparse en Python, mais je ne sais pas comment l'utiliser. La signature dit qu'elle devrait être appelée en tant que ArgumentError(argument, message), mais je ne peux pas comprendre ce que argument devrait être. Je pense que cela devrait faire partie de l'objet analyseur, mais je n'ai trouvé aucune documentation pour cela.

40
asmeurer

De la documentation source :

ArgumentError: exception déclenchée par les objets ArgumentParser lorsqu'il y a des erreurs avec les actions de l'analyseur. Les erreurs soulevées lors de l'analyse de la ligne de commande sont détectées par ArgumentParser et émises sous forme de messages de ligne de commande.

Le paramètre argument du constructeur est l'objet Action à partir duquel l'exception est levée. Habituellement, il n'est pas nécessaire de l'augmenter en dehors d'une sous-classe Action, et lors de la sous-classification, il n'est pas nécessaire de l'augmenter explicitement; vous augmentez généralement ValueError (ou ce qui est approprié) à la place.

Valeurs flottantes entre 0 et 1

En ce qui concerne votre commentaire, que vous ne souhaitez accepter que des valeurs à virgule flottante entre 0 et 1. Pour cela, vous devez utiliser la possibilité de définir des types personnalisés. Vous pouvez le faire par exemple comme ceci:

def percentFloat (string):
    value = float(string)
    if value < 0 or value > 1:
        raise argparse.ArgumentTypeError('Value has to be between 0 and 1')
    return value

parser = argparse.ArgumentParser()
parser.add_argument('test', type=percentFloat)
parser.parse_args()

Notez que cela est également sûr contre les non-flottants car float(string) lèvera un ValueError pour les non-flottants qui déclenche également une erreur de type invalide par le module argparse. ArgumentTypeError n'est qu'un moyen de spécifier un message d'erreur personnalisé.

Paramètres mutuellement exclusifs

Pour les paramètres mutuellement exclusifs, vous devez utiliser argparse.add_mutually_exclusive_group .

Dépendance des paramètres

La dépendance des paramètres n'est pas vraiment quelque chose qui devrait être fait par l'argument analyseur . Pour les détails sémantiques, vous devriez plutôt le faire vous-même:

args = parser.parse_args()
if args.w and not args.p:
    parser.error('-p is required when -w is set.')

Vous pouvez utiliser ArgumentParser.error pour afficher un message d'erreur personnalisé qui interrompra le programme et s'imprimera sur la console.

Mais bien sûr, dans une telle situation de base, il serait beaucoup plus logique de deviner implicitement -p Si possible.

58
poke

Alors que parser.error() est ce que la plupart des gens veulent probablement, il est également possible d'utiliser argparse.ArgumentError () (comme la question le demande.) Vous avez besoin d'une référence à l'argument, comme bar_arg dans l'exemple ci-dessous:

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--foo')
bar_arg = parser.add_argument('--bar')

args = parser.parse_args()
if args.bar == 'xyzzy':
    raise argparse.ArgumentError(bar_arg, "Can't be 'xyzzy'")

if args.foo == 'xyzzy':
    parser.error("Can't be 'xyzzy'")

Cela se traduira par une sortie comme celle ci-dessous:

$ python argparse_test.py --foo xyzzy
usage: argparse_test.py [-h] [--foo FOO] [--bar BAR]
argparse_test.py: error: Can't be 'xyzzy'

$ python argparse_test.py --bar xyzzy
Traceback (most recent call last):
  File "argparse_test.py", line 10, in <module>
    raise argparse.ArgumentError(bar_arg, "Can't be 'xyzzy'")
argparse.ArgumentError: argument --bar: Can't be 'xyzzy'
14
ukrutt