首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有办法控制在Python argparse中计算参数的顺序

有没有办法控制在Python argparse中计算参数的顺序
EN

Stack Overflow用户
提问于 2019-03-30 00:46:36
回答 2查看 310关注 0票数 4

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

因此,我的问题是,是否有任何解决方案来强制argparse在评估某些参数之前评估其他参数……

代码语言:javascript
复制
    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))

调用此脚本可实现以下功能:

代码语言:javascript
复制
$python test.py -i test.bed -V 2
Verbosity inside  CheckFile(): 0
Verbosity inside Set_verbosity_level(): 2
Verbosity in Main: 2
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-30 01:30:38

我不知道您是否可以强制先读取argparse变量,但您可以在main函数中使用内置在命令行解析器中的python:

代码语言:javascript
复制
import sys

# Your classes here #

if __name__ == '__main__':
    verbosity = 0
    for i, sysarg in enumerate(sys.argv):
        if str(sysarg).strip().lower().replace('-','') in ['v', 'verbose']:
            try:
                verbosity = sys.argv[i + 1]
            except IndexError:
                print("No verbosity level specified")
    # more code

它不是很优雅,也不是argparse,但它是一种确保你首先获得冗长的方法。

您还可以更新您的CheckFile类以包含详细检查函数:

代码语言:javascript
复制
class CheckFile(argparse.FileType):
    """
    Check whatever in the file
    """

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

    def _check_verbosity(self):
        verbosity = 0
        for i, sysarg in enumerate(sys.argv):
            if str(sysarg).strip().lower().replace('-','') in ['v', 'verbose']:
                try:
                verbosity = sys.argv[i + 1]
            except IndexError:
                print("No verbosity level specified")

        return verbosity

    def __call__(self, string):
        # Do whatever processing/checking/transformation
        # e.g print some message according to verbosity
        print("Verbosity inside  CheckFile(): {}".format(self._check_verbosity()))
        return super(CheckFile, self).__call__(string)

我再说一次,我知道这不是对argparse问题的真正回答,但它是您问题的解决方案

票数 1
EN

Stack Overflow用户

发布于 2019-03-30 01:54:00

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

代码语言:javascript
复制
python test.py -V 2 -i test.bed

这将输出以下内容:

代码语言:javascript
复制
Verbosity inside Set_verbosity_level(): 2
Verbosity inside  CheckFile(): 2

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55422008

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档