私は相互に排他的なオプションのグループを持つコマンドラインを解析したいと思います。通常、私はを使って、名前空間にはargs.foo = 'bar'
python argparse store --foo = bar as args.key = 'foo'、args.value = 'bar'
を使用していますが、私は、これらのオプションのいくつかを下流に送る必要があります。私が本当に好きなのは、args.foo='bar'
の代わりにargs.option_name = 'foo', args.option_value = 'bar'
を自分の名前空間に戻すことです。私がやった何
は次のとおりです。--foo=bar
が解析されるとき
Namespace(thing_key='--foo', thing='bar')
:
class KeyAction(argparse.Action):
def __call__(self, parser, namespace, values, option_string=None):
setattr(namespace, self.dest, values)
setattr(namespace, self.dest+'_key', option_string)
frob = parser.add_mutually_exclusive_group()
frob.add_argument('--foo', dest='thing', nargs='?', action=KeyAction)
frob.add_argument('--nar', dest='thing', nargs='?', action=KeyAction)
実行したときに、私の名前空間は次のようになります。もちろん、悲しいことに、--fooまたは--narが渡されない場合、namespace.thing_key
が定義されないため、getattr()
を使用する必要があります。
機能のオーバーライドは機能的ですが、実際には適切ではないようです。
私はargparseの背後にある賢い人たちがすでに何らかの形でこの権利を持っていると思っています。私はそれをドキュメントと私の のargparse.pyから読んでいます。
これを行うには最高の、正しい、ピジョンソニックは何ですか?サブパーザル? 私はPython 3.5を使用しています。
このように、両方の答えのデータを使って、オプションを処理し、引数をとり、初期化時にすべてをうまく設定しました。
ヒント、手がかり、および検証いただきありがとうございます。私はこれが前にargparseに現れておらず、標準化された何かになるのに驚いています。 はコーナーケースですが、相互排他的なオプションを使用するとコーナーケースの多くはありません。私はそれを理解したよう
class ValueAction(argparse.Action):
"""Override to store both the format type as well as the argument"""
# pylint: disable=too-few-public-methods
def __init__(self, option_strings, dest, **kwargs):
self._dest = dest
dest = dest + '_arguments'
container = kwargs.pop('container')
kwargs['action'] = kwargs.pop('subaction')
action_class = container._pop_action_class(kwargs)
if not callable(action_class):
raise ValueError('unknown action "%s"' % (action_class,))
self._action = action_class(option_strings, dest, **kwargs)
super().__init__(option_strings, dest, **kwargs)
def __call__(self, parser, namespace, values, option_string=None):
self._action(parser, namespace, values, option_string)
if isinstance(option_string, str):
while option_string[0] in parser.prefix_chars:
option_string = option_string[1:]
setattr(namespace, self._dest, option_string)