Python argparse игнорирует непризнанные аргументы

Optparse, старая версия просто игнорирует все непризнанные Аргументы и осуществляет. В большинстве ситуаций это не идеально и было изменено в argparse. Но есть несколько ситуаций, когда вы хотите игнорировать любые непризнанные Аргументы и анализировать те, которые вы указали.

например:

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

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

можно ли как-то заменить это?

3 ответов


заменить

args = parser.parse_args()

С

args, unknown = parser.parse_known_args()

например,

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']

вы можете поместить оставшиеся части в новый аргумент с помощью parser.add_argument('args', nargs=argparse.REMAINDER) Если вы хотите использовать их.


На самом деле argparse все еще "игнорирует"_unrecognized_args. До тех пор, пока эти "непризнанные" аргументы не используйте префикс по умолчанию вы не услышите никаких жалоб от анализатора.

используя конфигурацию @anutbu, но со стандартным parse.parse_args(), если мы должны были выполнить нашу программу со следующими аргументами.

$ program --foo BAR a b +cd e

у нас будет этот сбор данных с пространством имен для работы.

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

если бы мы хотели префикс по умолчанию - игнорируется мы могли бы изменить ArgumentParser и решить, что мы будем использовать + для наших "признанных" аргументов вместо этого.

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

одна и та же команда будет производить

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

положите это в трубку и курите его=)

кафе!