Python:如何从argparse获取所有默认值

问题描述 投票:2回答:4

当使用模块optparse时,我可以获得所有命令行参数的所有默认值,如下所示:

import optparse

if __name__ == '__main__':
    parser = optparse.OptionParser(usage='pokus --help')
    parser.add_option("-d", "--debug", action='store_true', dest="debug",
                      default=False, help='Enabling debugging.')
    options, args = parser.parse_args()
    print(parser.defaults)

由于optparse已被弃用,因此重写代码以使用argparse模块是明智之举。但是,我找不到任何方法如何获取添加到解析器对象的所有命令行参数的所有默认值:

import argparse

if __name__ == '__main__':
    parser = argparse.ArgumentParser(usage='pokus --help')
    parser.add_argument("-d", "--debug", action='store_true', dest='debug',
                        default=False, help='Enabling debugging.')   
    args = parser.parse_args()
    # <---- How to get default values for all arguments here?
    # Not: vars(args)

当我使用(./app.py -d)或没有任何命令行参数(./app.py)运行程序时,我想获取所有默认值。

python argparse default-value
4个回答
2
投票

如果您不想解析空输入字符串,可以使用get_default对象中的方法parser

import argparse

if __name__ == '__main__':
    parser = argparse.ArgumentParser(usage='pokus --help')
    parser.add_argument("-d", "--debug", action='store_true', dest='debug',
                        default=False, help='Enabling debugging.')   
    args = parser.parse_args()

    # To get a single default:
    d_default = parser.get_default('d')

    # To get all defaults:
    all_defaults = {}
    for key in vars(args):
        all_defaults[key] = parser.get_default(key)

3
投票

我找到了解决方案

import argparse

if __name__ == '__main__':
    parser = argparse.ArgumentParser(usage='pokus --help')
    parser.add_argument("-d", "--debug", action='store_true', dest='debug',
                        default=False, help='Enabling debugging.')
    parser.add_argument("-e", "--example", action='store', dest='example',
                        default="", help='Example of argument.')
    # Arguments from command line and default values
    args = vars(parser.parse_args())
    # Only default values
    defaults = vars(parser.parse_args([]))

然后,您可以比较argsdefaults值,并从命令行区分默认值和值。


1
投票

为了您的信息,这里是代码,在解析开始时初始化defaults

def parse_known_args(...):
    ....
    # add any action defaults that aren't present
    for action in self._actions:
        if action.dest is not SUPPRESS:
            if not hasattr(namespace, action.dest):
                if action.default is not SUPPRESS:
                    setattr(namespace, action.dest, action.default)

    # add any parser defaults that aren't present
    for dest in self._defaults:
        if not hasattr(namespace, dest):
            setattr(namespace, dest, self._defaults[dest])
    ...

所以它循环通过parser._actions列表,收集action.default属性。 (action是由Action方法创建的parser.add_argument类对象。)。它还检查self._defaults。这是由parse.set_defaults方法修改的字典。这可用于设置未直接链接到动作的defaults

在解析命令行之后,可以评估命名空间中的默认字符串(使用action.type),例如将default='1'转换为整数1。

处理argparse中的默认值并非易事。你的parse_args([])可能是最简单的,前提是解析器没问题(即没有任何必需的参数)。

我不知道现在optparse设置了defaults属性。有一种非繁琐的方法,optparse.OptionParser.get_default_values


0
投票

对于上面的例子:

import argparse

if __name__ == '__main__':
   parser = argparse.ArgumentParser(usage='pokus --help')
   parser.add_argument("-d", "--debug", action='store_true', dest='debug',
                    default=False, help='Enabling debugging.') 

A.要以tuple格式获取其默认值的所有值:

In[1]: args = parser.parse_known_args()[0]
In[2]: args._get_kwargs()
Out[1]: [('debug', False)]

访问每个项目:

In[3]: args.debug
Out[2]: False

B.获取值及其默认值为dictionary格式

In[4]: dict_args = parser.parse_known_args()[0].__dict__
In[5]: dict_args
Out[3]: {'debug': False}

并访问每个键:

In[6]: dict_args['debug']
Out[4]: False

或者迭代打印它们:

In[7]: for key in dict_args:
...        print('value for %s is: %s'% (key, dict_args[key]))

Out[5]: value for debug is: False
© www.soinside.com 2019 - 2024. All rights reserved.