首页 > 解决方案 > 有没有办法控制在 Python argparse 中评估参数的顺序

问题描述

让我们看下面的例子。解析器包含两个参数——输入文件和详细程度。Set_verbosity_level() 函数用于将模块级/全局变量(在我的现实生活中是包级变量)的值控制为 0-4。CheckFile() 函数在输入文件中执行测试(在现实生活中取决于类型)。我想根据详细程度在 CheckFile() 中打印消息。问题是 argparse 在 Set_verbosity_level() 之前调用 CheckFile() 因此在 CheckFile 中详细级别始终为 0/default ...

所以我的问题是是否有任何解决方案可以强制 argparse 在其他参数之前评估一些参数......

    import argparse

    VERBOSITY = 0


    def Set_verbosity_level():
        """Set the verbosity level.
        """

        def type_func(value):
            a_value = int(value)
            globals()['VERBOSITY'] = value
            print("Verbosity inside Set_verbosity_level(): " + str(globals()['VERBOSITY']))
            return value

        return type_func


    class CheckFile(argparse.FileType):
        """
        Check whatever in the file
        """

        def __init__(self, mode='r', **kwargs):
            super(CheckFile, self).__init__(mode, **kwargs)

        def __call__(self, string):
            # Do whatever processing/checking/transformation
            # e.g print some message according to verbosity
            print("Verbosity inside  CheckFile(): " + str(globals()['VERBOSITY']))
            return super(CheckFile, self).__call__(string)


    def make_parser():
        """The main argument parser."""
        parser = argparse.ArgumentParser(add_help=True)

        parser.add_argument("-V",
                            "--verbosity",
                            default=0,
                            type=Set_verbosity_level(),
                            help="Increase output verbosity.",
                            required=False)

        parser.add_argument('-i', '--inputfile',
                            help="Input file",
                            type=CheckFile(mode='r'),
                            required=True)

        return parser


    if __name__ == '__main__':
        myparser = make_parser()
        args = myparser.parse_args()
        print("Verbosity in Main: " + str(VERBOSITY))

调用此脚本给出:

$python test.py -i test.bed -V 2
Verbosity inside  CheckFile(): 0
Verbosity inside Set_verbosity_level(): 2
Verbosity in Main: 2

标签: pythonargparse

解决方案


argparse按列出的顺序处理命令行参数,因此如果您只是交换给定选项的顺序,它将以您想要的详细程度输出:

python test.py -V 2 -i test.bed

这输出:

Verbosity inside Set_verbosity_level(): 2
Verbosity inside  CheckFile(): 2

没有其他方法可以告诉argparse以与列出方式不同的顺序处理命令行参数。


推荐阅读