ArgParse Python模块:更改内置参数的默认参数值



我有一堆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()

第一个帖子,所以希望我的礼仪还可以。

非常感谢,Dave

是(文档):

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

set_defaults可能是最简单的修复方法。

但我认为值得一提的是,你可以直接更改动作的默认值

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对象,该对象包含您在参数中指定的所有信息。在这里,我将这些Actions保存(链接到)在变量outactionfooaction中。outaction.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对象,那么这些细节将更有意义。关于使用"私有"属性的常见注意事项适用。

相关内容

  • 没有找到相关文章

最新更新