2012-06-12 15 views
9
class StartAction(argparse.Action): 
    def __call__(self, parser, namespace, values, option_string=None): 
     print "Hello" 

start.add_argument('-s', '--start', action=StartAction) 

我知道通常有动作像'store_true'会阻止参数的要求,但有没有办法使用自定义动作,仍然不需要参数传递?Argparse - 无自变量的自定义操作?

所以,我想要的是:

python example.py -s

Hello

回答

15

尝试增加nargs=0start.add_argument

start.add_argument('-s', '--start', action=StartAction, nargs=0) 
+1

ValueError:存储操作的nargs必须> 0;如果你没有什么要存储的,诸如store true或store const之类的操作可能更合适 – Lucina

+1

我不同意@Lucina的评论。您可能需要调用自定义操作以在解析参数和复杂操作之间建立无缝映射。我优先考虑将Action对象作为CLI的参数,因此我在CLI itface和处理它的对象之间具有多态性。 – Daniel

3

由于mgilson suggestednargs=0的伎俩。由于它的内在到你的动作,我把它里面的动作:

class StartAction(argparse.Action): 
    def __init__(self, nargs=0, **kw): 
     super().__init__(nargs=nargs, **kw) 
    def __call__(self, parser, namespace, values, option_string=None): 
     print "Hello" 

start.add_argument('-s', '--start', action=StartAction) 

,你有你想要的行为,而无需添加nargs=0add_argument()通话的冗余。整洁,如果你有多个参数以相同的方式工作。

但是,用户仍然可以覆盖缺省值nargs=0,这对您的用例来说很愚蠢,如问题中所示。所以我会强制执行它:

class StartAction(argparse.Action): 
    def __init__(self, nargs=0, **kw): 
     if nargs != 0: 
      raise ValueError('nargs for StartAction must be 0; it is ' 
          'just a flag.') 
     super().__init__(nargs=nargs, **kw) 
    def __call__(self, parser, namespace, values, option_string=None): 
     print "Hello"