【问题标题】:ArgParse Python Module: Change default argument value for inherted argumentArgParse Python 模块:更改继承参数的默认参数值
【发布时间】:2014-04-17 10:39:59
【问题描述】:

我有一堆 Python 脚本,它们使用通用代码来读取输入和写入不同类型的输出文件。

这些是化学结构文件。一些示例文件类型是 .smi 或 .sdf。

默认情况下,我希望其中一些脚本以“smi”文件格式输出数据,而其他脚本以“sdf”格式输出数据。

是否可以覆盖从父解析器继承的参数的默认值?

例如...

# Inherited code
filesParser = argparse.ArgumentParser(add_help=False)
filesParser.add_argument('-o', dest='outformat', default="smi")

# Script code
parser = argparse.ArgumentParser(description='inherts from filesParser', parents=[filesParser])
parser.add_argument('--foo')

# Something like...
# parser.outformat.default = "sdf"

args = parser.parse_args()

第一次发帖,希望我的礼仪没问题。

非常感谢, 戴夫

【问题讨论】:

    标签: python inheritance default parent argparse


    【解决方案1】:

    是的 (docs):

    >>> parser.parse_args([])
    Namespace(foo=None, outformat='smi')
    >>> parser.set_defaults(outformat='sdf')
    >>> parser.parse_args([])
    Namespace(foo=None, outformat='sdf')
    

    【讨论】:

    • 非常感谢!我环顾了一会儿,没有发现。
    【解决方案2】:

    set_defaults 可能是最简单的解决方法。

    但我认为值得知道您可以直接更改 Action 的默认值

    filesParser = argparse.ArgumentParser(add_help=False)
    outaction=filesParser.add_argument('-o', dest='outformat', default="smi")
    parser = argparse.ArgumentParser(description='inherts from filesParser', parents=[filesParser])
    fooaction=parser.add_argument('--foo')
    print fooaction.default
    # None
    print outaction.default
    # 'smi'
    outaction.default='sdf'
    args=parser.parse_args()
    print args
    # Namespace(foo=None, outformat='sdf')
    

    add_argument 返回一个Action 对象,其中包含您在参数中指定的所有信息。在这里,我将这些操作保存(链接到)变量outactionfooactionoutaction.defaultparse_args 使用的默认值。

    使用继承的代码保存outaction 链接可能很尴尬(尽管可以在'parser._actions' 列表中找到它)。因此,让set_defaults 为您完成这项工作是有意义的。

    set_defaults 的代码可能具有指导意义:

    def set_defaults(self, **kwargs):
        self._defaults.update(kwargs)
    
        # if these defaults match any existing arguments, replace
        # the previous default on the object with the new one
        for action in self._actions:
            if action.dest in kwargs:
                action.default = kwargs[action.dest]
    

    首先它将新的默认值放入parser._defaults 字典中,然后有条件地修改action.default 属性(注意parser._actions 的搜索)。它必须同时做这两件事,因为在使用默认值时,action.default 值优先于parser._defaults 值。

    如果您在交互式 shell(例如 Ipython)中运行此代码并可以打印 actionparser 对象,这些细节将更有意义。使用“私有”属性的常见注意事项适用。

    【讨论】:

      猜你喜欢
      • 2021-10-16
      • 2012-03-06
      • 2017-10-13
      • 2014-12-07
      • 2018-01-22
      • 2017-05-28
      • 1970-01-01
      • 2011-01-09
      • 2019-06-14
      相关资源
      最近更新 更多