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

Можно ли перезаписать это?

Ответ 1

Заменить

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

Ответ 2

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

Ответ 3

На самом деле 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')

Положите это в свою трубку и курите =)

NJoy!