如何子类argparse.Action添加自定义操作?
问题描述:
我有一个命令行脚本,我试图运行,如果该值不存在,则将缺省值插入到名称空间中,或者如果它存在,则采用提供的参数。如何子类argparse.Action添加自定义操作?
所以我想这样做:
myscript.py --merge
会导致参数解析器命名空间看起来像这样:
命名空间(合并= ' - 合并')
否则,如果我叫
myscript.py
命名空间应该是这样的:
命名空间(合并=“DONTMERGE”)
我想我需要继承argparse.Action类的呼叫方法来执行自定义操作如下规定:https://pymotw.com/2/argparse/但我我无法弄清楚如何做到这一点。
我觉得这样的事情会做的伎俩:
class CustomAction(argparse.Action):
def __call__(self, parser, namespace, values, option_string=None):
if isinstance(self.values, None):
self.values = 'NOMERGE'
else:
self.values = '--nomerge'
setattr(namespace, self.dest, values)
不幸的是,我没有得到预期的结果。
答
我认为你只需要一个正常的store_const
参数。
parser.add_argument('--merge', action='store_const', const='MERGE', default='DONTMERGE')
如果你打电话给你的脚本--merge
,则merge
参数取值MERGE
(上面指定为const
)。否则,参数merge
取值DONTMERGE
(以上指定为default
)。
+0
谢谢。我错过了存储默认值的可能性。这看起来好像已经成功了。 如果你有一个关于如何做这个与子类化的建议,那么我会非常感谢指针。 –
为什么不只是使用'store_const'参数? – khelwood
我试过store_const,问题是我将不得不提供一个额外的参数给--merge,就像myscript --merge someotherarg通过命令行提供的参数通过管道传输到另一个脚本,我无法改变其行为。 –
看看链接的文章,'setattr'调用应该缩进更深一层。 – FamousJameous