web-dev-qa-db-fra.com

Je veux Python argparse pour lever une exception plutôt que l'utilisation

Je ne pense pas que ce soit possible, mais je veux gérer moi-même les exceptions de l'argparse.

Par exemple:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--foo', help='foo help', required=True)
try:
    args = parser.parse_args()
except:
    do_something()

Quand je l'exécute:

$ myapp.py
usage: myapp --foo foo
myapp: error: argument --foo is required

Mais je veux plutôt qu'il tombe dans l'exception.

36
joedborg

Vous pouvez sous-classer ArgumentParser et remplacer la méthode error pour faire quelque chose de différent en cas d'erreur:

class ArgumentParserError(Exception): pass

class ThrowingArgumentParser(argparse.ArgumentParser):
    def error(self, message):
        raise ArgumentParserError(message)

parser = ThrowingArgumentParser()
parser.add_argument(...)
...
66
Ned Batchelder

dans mon cas, argparse affiche "trop peu d'arguments" puis quitte. après avoir lu le code argparse, j'ai trouvé qu'il appelle simplement sys.exit () après avoir imprimé un message. comme sys.exit () ne fait que lancer une exception SystemExit, vous pouvez simplement capturer cette exception.

essayez donc ceci pour voir si cela fonctionne pour vous.

    try:
        args = parser.parse_args(args)
    except SystemExit:
        .... your handler here ...
        return
19
Jacob CUI