2015-12-18 10 views
6

私は2つの引数を取りPythonスクリプト、およびいくつかのオプションを書いています:Pythonのargparseヘルプのようなオプション

scriptname [-h] [-l] [-q|-d] arg1 arg2 

-q(静かな)と-d(デバッグ)オプションは、冗長レベルを変更し、-hオプションは、argparseによって自動的に作成されるヘルプオプションです。

は、私はそれが(そうでない場合は必須)引数が存在することを必要とし、(-hオプションとは異なる)、いくつかの有用な情報を表示されませんように-hオプションと同様に動作する-l(リスト)オプションをしたいと思います。実際には、このスクリプトは、次の3つの方法で呼び出すことができることを意味します:引数をオプションに

  1. scriptmane [-q|-d] arg1 arg2 
    scriptname -l 
    scriptname -h 
    

    2つの方法が前方になります(= NARGSと「?」) -l og -hオプションが指定されていないすべての場合に2つの引数があることを確認するコードを追加します。

  2. カスタムアクションクラスを作成します(詳細についてはわかりません)。

ただし、ヘルプオプションから「このオプションはすべて必要です」という動作を継承するより簡単な方法が必要です。 (samwyseの回答に基づいて)


ソリューション:

_HelpAction()argparse.py中に基づき:

class _ListAction(argparse.Action): 
    def __init__(self, 
       option_strings, 
       dest=argparse.SUPPRESS, 
       default=argparse.SUPPRESS, 
       help=None): 
     super(_ListAction, self).__init__(
      option_strings=option_strings, 
      dest=dest, 
      default=default, 
      nargs=0, 
      help=help) 

    def __call__(self, parser, namespace, values, option_string=None): 
     print_list() 
     parser.exit() 

、その後、パーサのセットアップ時:

parser.add_argument('-l', '--list', action=_ListAction, 
         help="List all available cases") 
+0

まさに私が考えていたものだが、私のスマートフォンではコード化が難しかった。 :) – samwyse

答えて

3

"list"オプションが "help"と異なる動作を意図している場合は、カスタムアクションを記述する必要があります。良いことは、これを行うことは非常に簡単だということです。 argparseのメインページにはヒントがあります。オプションが引数リストに表示されるとすぐにアクションが呼び出されることを認識するだけです。新しいアクションの呼び出し(両端に2つのアンダースコアがありますが、markdownは強調のためにそれらのメソッドを使います)では、あなたのオプションで何をする必要があれば何でもし、parser.exit()を呼び出してそれ以上の引数の処理を短絡します。

ここで_HelpActionと_VersionActionのソースを確認してください:https://github.com/ThomasWaldmann/argparse/blob/master/argparse.py(おそらく、そのうちの1つをサブクラス化して、initコードの作成をスキップしてください)。

1

あなたが簡単にできます​​でこれを行います。以下は、追加のヘルプオプションとして-l--listの両方をサポートします:

parser.add_argument("-l", "--list", action="help") 

あなたは、単に引数リストからそれを省略し、長い形式(--list)をサポートしない場合。

+0

これは単に "list"という単語を "help"の同義語にします。彼が別の行動を望むなら、彼はそのためのコードを書く必要があります。 – samwyse

+0

はい、これが私の質問の解釈方法です。しかし、おそらくそれは間違っています。それは、 '-h'のような別の議論を必要としないことのほんの一部です。 –

+0

いいえ、有用な情報を一覧表示して終了し、他の引数を必要としないという点で-hオプションと-lオプションが似ていることを意図しましたが、リストに表示されるテキストは異なります。私は編集し、それが明確になるかどうかを見ます。 –

関連する問題