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!