まずノートをドキュメントに - それは基本的にです使い慣れたドキュメントであり、正式なAPIではありません。の標準は、コード自体、単体テスト(test/test_argparse.py
)、下位互換性のための麻痺の懸念です。
help/usage
を読んでいる以外のユーザーは、通常、ユーザーがそれを知る必要がないため、allowed arguments
にアクセスする「公式の」方法はありません。
しかし、私はiteractiveセッションに簡単なパーサを示してみましょう:
In [247]: parser=argparse.ArgumentParser()
In [248]: a = parser.add_argument('pos')
In [249]: b = parser.add_argument('-f','--foo')
add_argument
は、それが作成したアクションオブジェクトを返します。これは文書化されていませんが、インタラクティブにパーサーを作成した人にとっては明らかです。
parser
オブジェクトには、主なパラメータを表示するrepr
メソッドがあります。しかし、それにはさらに多くの属性があります。これは、Ipythonでvars(parser)
、またはparser.<tab>
で見ることができます。
In [250]: parser
Out[250]: ArgumentParser(prog='ipython3', usage=None, description=None, formatter_class=<class 'argparse.HelpFormatter'>, conflict_handler='error', add_help=True)
アクションもrepr
です。 Actionサブクラスはaction
パラメータによって決定されます。
In [251]: a
Out[251]: _StoreAction(option_strings=[], dest='pos', nargs=None, const=None, default=None, type=None, choices=None, help=None, metavar=None)
In [252]: b
Out[252]: _StoreAction(option_strings=['-f', '--foo'], dest='foo', nargs=None, const=None, default=None, type=None, choices=None, help=None, metavar=None)
vars(a)
などを使用してすべての属性を表示できます。
キーparser
の属性は、定義済みのすべてのアクションのリスト_actions
です。これがすべての解析の基礎となります。自動的に作成されたアクションはhelp
です。 option_strings
を見てください。このアクションは、アクションがポジションかオプションかを決定します。
In [253]: parser._actions
Out[253]:
[_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),
_StoreAction(option_strings=[], dest='pos',....),
_StoreAction(option_strings=['-f', '--foo'], dest='foo', ...)]
_option_string_actions
アクション(_actions
に現れる同一のオブジェクト)へoption_strings
から辞書、マッピングです。これらのアクションオブジェクトへの参照は、すべてコードに表示されます。
In [255]: parser._option_string_actions
Out[255]:
{'--foo': _StoreAction(option_strings=['-f', '--foo'],....),
'--help': _HelpAction(option_strings=['-h', '--help'],...),
'-f': _StoreAction(option_strings=['-f', '--foo'], dest='foo',...),
'-h': _HelpAction(option_strings=['-h', '--help'], ....)}
In [256]: list(parser._option_string_actions.keys())
Out[256]: ['-f', '--help', '-h', '--foo']
各-
文字列には、長さまたは長さのキーがあります。 pos
には何もないので、位置には空のoption_strings
パラメータがあります。
そのキーのリストがあなたの望むものなら、それを使用してください。_
について心配しないでください。それは 'パブリック'エイリアスを持っていません。
私はhelp
を解析して同じことを理解できます。それは「プライベート」属性の使用を避けるだけの多くの作業です。文書化されていない属性が変更されることを心配するならば、変更されるヘルプフォーマットについても心配する必要があります。これはドキュメントの一部でもありません。
help
レイアウトはparser.format_help
によって制御されます。 usage
は、self._actions
の情報から作成されます。ヘルプラインからの情報
(あなたはaction groups
に入りたくないですか?)option_strings
を得るための別の方法があります
から_actions
からそれらを収集:
In [258]: [a.option_strings for a in parser._actions]
Out[258]: [['-h', '--help'], [], ['-f', '--foo']]
===================
探求とコードの詳細にビット:
parser.add_argument
アクションを作成し、parser._add_action
に渡します。これは、.actions
とaction.option_strings
の両方を入力する方法です。
self._actions.append(action)
for option_string in action.option_strings:
self._option_string_actions[option_string] = action
最初の「既存のパーサーオブジェクト」の重要性はどれくらいですか?パーサをゼロから作成しているのですか、別のモジュールからインポートしていますか?自動 'help'キーを含める必要がありますか? – hpaulj
私は 'help'キーも持っていたいと思いますが、手動で追加するのは問題ありません。 「既存の」部分は実際の制限です。私は、あなたの "dict-trick"を利用することができないと思う、あるいはシナリオを考えることができます。したがって、私は**既存の** ArgumentParserから実際に検索しています。 – m8mble
'_option_string_actions'は、既存のパーサーにとって最も信頼できる情報源となります。どのように入力されたかを覚えておいてください。接頭辞の文字、SUPPRESSの助け、そしてグループが 'help'レイアウトを変更し、ヘルプ検索を混乱させる可能性があります。 – hpaulj