argparse не возвращает ожидаемое значение для store_true - PullRequest
3 голосов
/ 10 апреля 2019

Я использую Python 3.6.8 :: Anaconda custom (64-bit) и получаю странные результаты от argparse. Несмотря на значение -x, значение trainandexecute = False

def get_parameters():
    startup = '-x -b'
    sys.argv = startup.split(' ')
    ap = argparse.ArgumentParser()
    ap.add_argument('-x',       '--trainandexecute', action='store_true')
    ap.add_argument('-b',       '--debug',           action='store_true')
    ap.add_argument('-d',       '--rundate',         action='store')
    print(ap.parse_args())
    return vars(ap.parse_args())
get_parameters()

Возвращает следующий вывод. Обратите внимание, что trainandexecute = False, несмотря на флаг -x.

Namespace(debug=True, execute=False, train=False, trainandexecute=False)
{'train': False,
 'execute': False,
 'trainandexecute': False,
 'debug': True}

Однако этот тест работает в следующей ячейке Jupyter, и это не моя среда:

def get_test_parameters():
    startup = '-b -x'
    sys.argv = startup.split(' ')
    print(sys.argv)
    ap = argparse.ArgumentParser()
    ap.add_argument('-x',       '--x',         action='store_true')
    ap.add_argument('-b',       '--debug',     action='store_true')
    print(ap.parse_args())
    return vars(ap.parse_args())

Итак, вывод:

get_test_parameters()

является:

['-b', '-x']                   # print(sys.argv)
Namespace(debug=False, x=True) # print(ap.parse_args())
{'x': True, 'debug': False}    # return vars(ap.parse_args())

У меня двойник ...

Ответы [ 2 ]

3 голосов
/ 10 апреля 2019

Ваша ошибка в этой строке:

sys.argv = startup.split(' ')

Первое значение в sys.argv обрабатывается как имя скрипта, а не как опция. Попробуйте запустить ap.parse_args(startup.split()) - и вы увидите правильный ответ.

Между прочим, не передавайте никакие параметры split(). Если вы передадите " " и у вас будет несколько последовательных пробелов, результат разделения будет содержать пустые строки.

1 голос
/ 10 апреля 2019

Вот лучший тестовый фреймворк:

def get_parameters(argv=None):
    ap = argparse.ArgumentParser()
    ap.add_argument('-x',       '--trainandexecute', action='store_true')
    ap.add_argument('-b',       '--debug',           action='store_true')
    ap.add_argument('-d',       '--rundate',         action='store')
    args = ap.parse_args(argv))     # if None, parses sys.argv[1:]
    print(args)
    return vars(args)

get_parameters('-x -b'.split())

Вместо этого вы можете изменить sys.argv[1:]. Пропустив argv через вашу функцию, вы можете протестировать несколько способов.

...