我有一堆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()
第一篇文章,所以希望我的礼仪没问题。
非常感谢, 戴夫
答案 0 :(得分:7)
是(docs):
>>> parser.parse_args([])
Namespace(foo=None, outformat='smi')
>>> parser.set_defaults(outformat='sdf')
>>> parser.parse_args([])
Namespace(foo=None, outformat='sdf')
答案 1 :(得分: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
对象,其中包含您在参数中指定的所有信息。在这里,我在变量outaction
和fooaction
中保存(链接到)这些操作。 outaction.default
是parse_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)中运行此代码并且可以打印action
和parser
对象,这些详细信息会更有意义。关于玩“私人”属性的常见警告适用。