web-dev-qa-db-fra.com

Python argparse ignore les arguments non reconnus

Optparse, l'ancienne version ignore simplement tous les arguments non reconnus et continue. Dans la plupart des situations, cela n’est pas idéal et a été modifié dans argparse. Cependant, il existe quelques situations dans lesquelles vous souhaitez ignorer les arguments non reconnus et analyser ceux que vous avez spécifiés.

Par exemple:

parser = argparse.ArgumentParser()
parser.add_argument('--foo', dest="foo")
parser.parse_args()

$python myscript.py --foo 1 --bar 2
error: unrecognized arguments: --bar

Est-il possible de remplacer cela?

164
jdborg

Remplacer

args = parser.parse_args()

avec

args, unknown = parser.parse_known_args()

Par exemple,

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--foo')
args, unknown = parser.parse_known_args(['--foo', 'BAR', 'spam'])
print(args)
# Namespace(foo='BAR')
print(unknown)
# ['spam']
287
unutbu

Vous pouvez mettre les parties restantes dans un nouvel argument avec parser.add_argument('args', nargs=argparse.REMAINDER) si vous voulez les utiliser.

16
lichenbo

En fait, argparse "ignore" toujours _unrecognized_args. Tant que ces arguments "non reconnus" n'utilisez pas le préfixe par défaut vous n'entendrez aucune plainte de l'analyseur.

En utilisant la configuration de @ anutbu mais avec la norme parse.parse_args(), si nous devions exécuter notre programme avec les arguments suivants.

$ program --foo BAR a b +cd e

Nous aurons cette collection de données Namespaced avec laquelle travailler.

Namespace(_unrecognized_args=['a', 'b', '+cd', 'e'], foo='BAR')

Si nous voulions ignorer le préfixe - Par défaut, nous pourrions changer le paramètre ArgumentParser et décider d'utiliser à la place un + Pour nos arguments "reconnus".

parser = argparse.ArgumentParser(prefix_chars='+')
parser.add_argument('+cd')

La même commande produira

Namespace(_unrecognized_args=['--foo', 'BAR', 'a', 'b'], cd='e')

Mettez ça dans votre pipe et fumez le =)

nonJoy!

7
nickl-