2017-11-18 2 views
1

すでに引数グループが定義されているとします。今私はいくつかの追加の引数を追加するためにそれらの1つにアクセスしたいです。だから、argparseでこれを行う最良の方法は何ですか?今度は私のアプローチは次のようになります:argparseですでに定義されている引数グループにアクセスするにはどうすればよいですか?

def get_parser(self, ...): 
    parser = ... 

    matching_groups = (g for g in parser._action_groups 
         if g.title == 'group name') 
    group = next(matching_groups, None) or parser 
    group.add_argument('-s', '--some-new-argument', ...) 
    return parser 

「保護された」メンバーに直接アクセスしないようにするもっと洗練された方法はありますか?

+0

いいえ、これらのグループの「保護されていない」リストはありません。 Pythonでは、このような属性名の使用は「カジュアルなユーザーにはこれを必要としないと思っています」という意味ですが、知識のあるユーザーはそれらを使用することを禁じられていません。 'argparse.py'では、' _action_groups'は '_add_container_actions'の' parents'メカニズムと 'help formatter'を設定するときに使われます。リストは解析に使用されません。 – hpaulj

+0

'_action_groups'の他の用途:https://stackoverflow.com/questions/39047075/reorder-python-argparse-argument-groups、https://stackoverflow.com/questions/12268602/sort-argparse-help-alphabetically – hpaulj

答えて

0

add_argument_groupに電話すると、グループが返されます。後でグループにアクセスする必要がある場合は、その戻り値を何かに割り当てます。

グループが多数ある場合は、たとえば、グループのタイトルのグループをグループに使用できます。パーサーインスタンスには__dict__があります。これは、必要に応じて、パーサーに属性として直接グループやその他のものを格納できることを意味します。

>>> parser = argparse.ArgumentParser() 
>>> parser.groups = {} 
>>> group = parser.groups['my_group'] = parser.add_argument_group('my_group') 
>>> parser.groups['my_group'] is group 
True 
+0

私はそれがグループを返すことを知っていますが、残念ながら私は '開始点'として使用しているライブラリを変更できません。したがって、唯一の方法は、すでに実装されているコードを '拡張'することです。 – machin

関連する問題