2017-11-10 110 views
0

我有一个命令行脚本,我试图运行,如果该值不存在,则将缺省值插入到名称空间中,或者如果它存在,则采用提供的参数。如何子类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) 

不幸的是,我没有得到预期的结果。

+1

为什么不只是使用'store_const'参数? – khelwood

+0

我试过store_const,问题是我将不得不提供一个额外的参数给--merge,就像myscript --merge someotherarg通过命令行提供的参数通过管道传输到另一个脚本,我无法改变其行为。 –

+0

看看链接的文章,'setattr'调用应该缩进更深一层。 – FamousJameous

回答

3

我认为你只需要一个正常的store_const参数。

parser.add_argument('--merge', action='store_const', const='MERGE', default='DONTMERGE') 

如果你打电话给你的脚本--merge,则merge参数取值MERGE(上面指定为const)。否则,参数merge取值DONTMERGE(以上指定为default)。

请参阅https://docs.python.org/2/library/argparse.html#action

+0

谢谢。我错过了存储默认值的可能性。这看起来好像已经成功了。 如果你有一个关于如何做这个与子类化的建议,那么我会非常感谢指针。 –

相关问题