标记为在Argparse中不需要强制性参数?

时间:2019-04-09 14:17:49

标签: python argparse

我有一个程序,可以通过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 个答案:

答案 0 :(得分:1)

-h的工作方式是触发类型为_HelpAction的特定动作,就像由类似的东西定义一样

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

此操作(最终)将调用sys.exit,因此绕过了解析算法的其余部分,使必需参数的问题变得毫无意义。

您可以通过子类化TestAction来定义自己的自定义操作Action(有关详细信息,请参见https://docs.python.org/3/library/argparse.html#action),然后用{p>​​定义--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)

或者,定义单独的子命令testrun,以便仅run子命令具有必需的参数,而test子命令仅运行测试并存在。 / p>


但是,最好的办法是使运行单元测试与运行脚本脱钩。甚至没有理由在希望运行脚本的环境中部署单元测试。使用单独的测试运行器脚本(或类似nosetests的脚本)运行测试,而无需运行脚本本身。