почему функция argparse не работает с nargs? - PullRequest
0 голосов
/ 14 июня 2019

Эти строки работают:

parser = argparse.ArgumentParser(prog='PROG')
parser.add_argument('foo', nargs='+', type=lambda x:x.split('/'))
parser.parse_args(['3/5', '4/6']) # output Namespace(foo=[['3', '5'], ['4', '6']])

Но следующее не работает.Зачем?

Единственное отличие состоит в том, что на этот раз кастер типов использует понимание списка для преобразования строк в целые числа.

parser = argparse.ArgumentParser(prog='PROG')
parser.add_argument('foo', nargs='+', type=lambda x:[[int(a), int(b)] for a,b in x.split('/')])
parser.parse_args(['3/5', '4/6']) # Raise error: argument foo: invalid <lambda> value: '3/5'

1 Ответ

0 голосов
/ 14 июня 2019

По сути, здесь вы пытаетесь сделать

for a, b in '3/5'.split('/')...

, который представляет собой ValueError («недостаточно значений для распаковки»). argparse скрывает фактические ошибки и отвечает общим ArgumentError, если что-то не так с вашей функцией type. Возможно, вы захотите использовать фактический def вместо этого для отладки:

def test(x):
    try:
        return [[int(a), int(b)] for a,b in x.split('/')]
    except Exception as e:
        print(e)

parser = argparse.ArgumentParser(prog='PROG')
parser.add_argument('foo', nargs='+', type=test)
parser.parse_args(['3/5', '4/6'])
...