Флаг не требующий обязательных аргументов в Argparse? - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть программа, которая принимает входной файл, формат ввода и формат вывода в качестве обязательных аргументов через argparse.Тем не менее, я хотел бы иметь «--test» в качестве флага, где он будет проходить через все мои юнит-тесты.

Как мне установить этот флаг, чтобы он мог работать без обязательных аргументов?Точно так же, как это делает традиционный флаг -h?

def process_args():
    global args
    parser = argparse.ArgumentParser(description="Convert quantum circuits into different environments")
    parser.add_argument("input_filename", help="input filename")
    parser.add_argument("input_format", help="input format of your script", choices=valid_program_types)
    parser.add_argument("output_format", help="output format of your script", choices=valid_program_types)
    parser.add_argument("-o", "--output_filename", help="set output filename, without file extension "
                                                        "(default: convertqc_result.<filetype>")
    parser.add_argument("-d", "--debug", help="enable debug mode", action="store_true")
    args = parser.parse_args()

1 Ответ

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

-h работает, вызывая определенное действие типа _HelpAction, как если бы оно было определено чем-то вроде

parser.add_argument('-h', action='help')

Это действие вызывает (в конце концов) sys.exit, и поэтому обходит остальныеАлгоритм разбора, что делает вопрос о необходимых аргументах спорным.

Вы можете определить свое собственное настраиваемое действие TestAction, создав подкласс Action (подробности см. https://docs.python.org/3/library/argparse.html#action), а затем определив --test с помощью

class TestAction(argparse.Action):
    def __call__(self, parser, namespace, values, option_string=None):
        """ Run your tests and exit the script here """

parser.add_argument("--test", action=TestAction)

В качестве альтернативы определите отдельные подкоманды test и run, чтобы только у подкоманды run были обязательные аргументы, а подкоманда test просто запускает ваши тесты и существует.


Тем не менее, лучшее, что нужно сделать, - это отделить запуск ваших модульных тестов от запуска вашего скрипта.Нет оснований даже развертывать ваши модульные тесты в среде, где вы ожидаете запустить свой скрипт.Используйте отдельный сценарий запуска тестов (или что-то вроде nosetests) для запуска ваших тестов без запуска самого сценария.

...