2016-05-18 36 views
7

私はargpraseを使用してオプションを作成しています。これは特定のジョブを実行するための非常に特殊なオプションです。このスクリプトには現在、約30個のノブがあり、ほとんどが定期的に使用されていません。argparseを使って隠しオプションを表示

私はオプション作成しています:

opt.add_argument('-opt',help="Some Help", help=argparse.SUPPRESS) 

をしかし、私は、スクリプトのヘルプを表示するには二つの方法があるようにしたい:私は-help-長いもしたい

my_script -help 
my_script -help-long 

すべての隠されたargsを表示します。私はこれを行う方法を見つけることができませんでした。

この動作を実装する方法はありますか?

+1

私はあなたが実際に文字列である 'argparse.SUPPRESS'を持つ属性のヘルプを上書きしていることから、それが可能だとは思わない:'「== SUPPRESSが==」 '。 'add_argument'の実装を見れば、' help == '== SUPPRESS ==' ' –

+0

の場合、メソッド全体がスキップされることがわかります。これは話題にはなりません - この文脈でどのノブが意味するのか、私はコンピュータコードノブのためのグーグルと関連する何かを見ませんでした。 – PyNEwbie

+0

これは単なるオプションの同義語です。 – chepner

答えて

8

これをサポートする組み込みの方法はないと思います。おそらく、直接sys.argvをチェックして、あなたはパーサを構築する方法を変更することを利用して、その周りにハックすることができます

import sys 
show_hidden_args = '--help-long' in sys.argv 

opt = argparse.ArgumentParser() 
opt.add_argument('--hidden-arg', help='...' if show_hidden_args else argparse.SUPPRESS) 
opt.add_argument('--help-long', help='Show all options.', action='help') 


args = opt.parse_args() 

もちろん、何度もこれを書くことがあまりにも不便であるならば、あなたはヘルパー関数でそれをラップすることができます(またはサブクラスArgumentParser):

def add_hidden_argument(*args, **kwargs): 
    if not show_hidden_args: 
     kwargs['help'] = argparse.SUPPRESS 
    opt.add_argument(*args, **kwargs) 

そして、あなたはおそらく、ユーザーがそれはおそらく何を知っているように、非隠された--help-long引数を追加したいと思う...

+0

文書化されていない機能を使用しないで最も洗練された解決策であるようです –

1

あなたはをサブクラス化することで何かを達成できますと_HelpAction:これはsys.argvに見て、@ mgilsonの答えのバリエーションです

class LongHelp(argparse._HelpAction): 
    def __init__(self,*args, **kwargs): 
     super().__init__(*args, **kwargs) 

    def __call__(cls, parser, namespace, values, option_string): 
     print(parser.long_help) 

class ArgParserWithLongHelp(argparse.ArgumentParser): 
    def __init__(self): 
     super().__init__(self) 
     self.long_help = {} 
     self.add_argument("--long-help", action=LongHelp) 

    def add_argument(self, *args, **kwargs): 
     if kwargs.get('long_help'): 
      self.long_help.update({k:kwargs['long_help'] for k in args}) 
      kwargs.pop('long_help') 
     super().add_argument(*args, **kwargs) 

opt = ArgParserWithLongHelp() 
opt.add_argument('-opt', help=argparse.SUPPRESS, long_help='Some extra help') 
args = opt.parse_args() 
+0

これは、argparseのようにヘルプメッセージをフォーマットするのではなく、少し奇妙です。もっと便利な方法でヘルプメッセージを書式設定するための良い作業をしてください(私は些細な作業ではないと思います)。 – mgilson

+0

はい、そのアイデアを見せてくれるだけでした。たぶん_HelpActionの書式設定メソッドを使用することができます。あなたのソリューションは、確かにもっと真っ直ぐです。 –

+0

引数: 'hidden'に追加のプロパティを追加した方が良いでしょう。 '--help'で起動された場合、' _HelpAction'は 'hidden'を無視します。 '--help-long'は両方を呼び出します。必要なら '--help-long'を非表示にすることさえできます。 –

1

は、私が尋ねると--helpを解釈するために選択した私たちは、いくつかの助けか。ここ

import argparse 
import sys 

def hide_args(arglist): 
    for action in arglist: 
     action.help=argparse.SUPPRESS 

hidelist=[]  
parser = argparse.ArgumentParser() 
a1 = parser.add_argument('--foo',help='normal') 
a2 = parser.add_argument('--bar',help='hidden') 
hidelist.append(a2) 

if '-h' in sys.argv[1:]: 
    hide_args(hidelist) 
args = parser.parse_args() 

を抑える必要があるかどうかを確認します長い助けのために;短くは-h。代わりに別の--longhelp引数を追加できました。短いヘルプ

1207:~/mypy$ python3 stack37303960.py -h 
usage: stack37303960.py [-h] [--foo FOO] 

optional arguments: 
    -h, --help show this help message and exit 
    --foo FOO normal 

add_argumentため

1207:~/mypy$ python3 stack37303960.py --help 
usage: stack37303960.py [-h] [--foo FOO] [--bar BAR] 

optional arguments: 
    -h, --help show this help message and exit 
    --foo FOO normal 
    --bar BAR hidden 

は、それが作成さActionオブジェクトへのポインタを返します。ここでは、選択したものをhidelistに保存します。条件付きでそのリストを反復し、helpを​​に変更します。アクションの属性の多くは、最初の作成(インタラクティブセッションでの実験)後に変更できます。

パーサーは、アクションのリストも保持します。デフォルトのhelpは、parser._actionsのリストの最初のものです。ヘルプの解析とフォーマットの両方にこのリストを使用します。

In [540]: parser._actions[0] 
Out[540]: _HelpAction(option_strings=['-h', '--help'], dest='help', nargs=0, const=None, default='==SUPPRESS==', type=None, choices=None, help='show this help message and exit', metavar=None) 
+0

FWIW、あなたは、文書化されていないargparse機能の束に頼っています。私が最後にチェックしたとき、 'parser.add_argument'が_anything_を返すことは文書化されていませんでした。それで、argparse内部はかなり安定していると思うので、おそらくあなたが取っているリスクは大きくはありません。 – mgilson

+0

'argparse'のドキュメントはそのようなことで少し弱いです。 How-Toの詳細はたくさんありますが、クラスとその生成方法を体系的に説明するものではありません。私はIpythonセッションで私の 'argparse'テストの大部分を行っているので、それは第二の性質になっています。 http://bugs.python.org/issue19462では、 'remove_argument'メソッドを望んでいたポスターのためのいくつかの同様のアクションを提案します。 – hpaulj

+0

2年前に 'add_argument'の返却が文書化されていないというバグや問題がありました。 http://bugs.python.org/msg225794しかし、キューにはもっと便利な修正があります。 – hpaulj

関連する問題