Argparse принять все - PullRequest
       8

Argparse принять все

13 голосов
/ 10 марта 2012

Есть ли способ, чтобы argparse.ArgumentParser не вызывал исключение при чтении неизвестного параметра, а скорее помещал все неизвестные параметры со значениями в словаре, а те, которые не имеют значения, в списке?

Например, скажем, что в синтаксическом анализаторе не определено ни одного аргумента для prog.py, и я передаю два аргумента:

./prog.py --foo bar --baz

Хотелось бы следующее:

parsed = parser.parse_args()
vals = parsed.unknown_with_vals
novals = parsed.unknown_without_vals

print(vals)
#{'foo' : 'bar'}
print(novals)
#['baz']

Можно ли это сделать?

1 Ответ

9 голосов
/ 10 марта 2012
known, unknown_args = parser.parse_known_args(...)

Как заметил в комментарии @ben w, как вы разбираете unknown_args зависит от вас, например, со следующей грамматикой:

unknown_args = *(with_val / without_val) EOS
with_val = OPT 1*VALUE
without_val = OPT
OPT = <argument that starts with "--">
VALUE = <argument that doesn't start with "--">

Или как регулярное выражение:

(O V+ | O)* $

Примечание: в этом случае запрещенные значения запрещены.

Пример

d = {}
for arg in unknown_args:
    if arg.startswith('--'): # O
        opt = arg
        d[opt] = []
    else: # V
        d[opt].append(arg) #NOTE: produces NameError if an orphan encountered

with_vals = {k: v for k, v in d.items() if v}
without_vals = [k for k, v in d.items() if not v]
...