2012-06-12 11 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

てみてください、あなたstart.add_argumentnargs=0を追加:トリックを行い

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

ValueError:ストアアクションのnargsは> 0でなければならない。何も保存する必要がない場合は、trueを格納するかconstを格納するなどの処理が適切です。 – Lucina

+1

@Lucinaコメントに同意しません。パースの引数と複雑なアクションをシームレスにマッピングするカスタムアクションを呼び出すことができます。 CLIのパラメータとして動作するActionオブジェクトを持つことを前提としているため、CLIのインタフェースとそれを処理するオブジェクトの間に多相性があります。 – Daniel

3

nargs=0mgilson suggested通り。

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) 

をそして、あなたはすべてのadd_argument()コールにnargs=0を追加することの冗長性なしに、ご希望の動作を持っている:それはあなたの行動に固有なので、私はアクションの中に置くと思います。同じように複数の議論が働いている場合は、きちんとしてください。

しかし、ユーザーは依然として質問に示されているように、ユースケースのために愚かな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" 
関連する問題