57313


# 環境

  * Python 3.7.2

# 背景

[argparser](https://docs.python.org/ja/3/library/argparse.html)
でCLIコマンドを作成しています。

作成したいコマンドには、以下のオプション引数があります。

  * `--project_id`
  * `--user_id`
  * `--organization_id`
  * `--logdir`
  * `--yes`

`--logdir`と`--yes`オプション引数は、全コマンドで共通のオプション引数です。  
ヘルプ表示では、これらのオプションを"positional arguments"や"optional
arguments"と区別して表示したいです。[add_argument_group](https://docs.python.org/ja/3/library/argparse.html#argument-
groups) を使って、`--logdir`と`--yes`オプション引数は"global optional
arguments"という引数グループにしました。

[code]

        parser = argparse.ArgumentParser()
        parser.add_argument('--project_id', type=str, help='Project ID')
        parser.add_argument('--user_id', type=str, help='User ID')
        parser.add_argument('--organization_id', type=str, help='Organization ID')
    
        # 共通のオプション引数
        group = parser.add_argument_group("global optional arguments")
        group.add_argument('--yes', action="store_true", help="処理中に現れる問い合わせに対して、常に'yes'と回答します。")
        group.add_argument('--logdir', type=str, default=".log", help="ログファイルを保存するディレクトリを指定します。")
    
        args = parser.parse_args()
    
    
    
[/code]

[code]

    $ python test_command.py -h
    usage: test_command.py [-h] [--project_id PROJECT_ID] [--user_id USER_ID]
                           [--organization_id ORGANIZATION_ID] [--yes]
                           [--logdir LOGDIR]
    
    optional arguments:
      -h, --help            show this help message and exit
      --project_id PROJECT_ID
                            Project ID
      --user_id USER_ID     User ID
      --organization_id ORGANIZATION_ID
                            Organization ID
    
    global optional arguments:
      --yes                 処理中に現れる問い合わせに対して、常に'yes'と回答します。
      --logdir LOGDIR       ログファイルを保存するディレクトリを指定します。
    
    
[/code]

# 質問

`--help`オプションは"optional arguments"グループに所属しています。  
しかし`--help`は全コマンド共通なので、"global optional arguments"グループ所属させたいです。  
`--help`オプションのグループを変更することは可能でしょうか？  
可能でしたら、その方法を教えていただきたいです。


CC BY-SA 4.0
2019-08-11T07:44:33.977
57298
2019-08-12T04:48:44.503
19524
question
python
helpオプションを"optional arguments"グループから、別のグループに変更したいです。


正攻法とは言えないですが、  
以下のようにすると一応移動しました。

[code]

    import argparse
    
    parser = argparse.ArgumentParser()
    parser.add_argument('--project_id', type=str, help='Project ID')
    parser.add_argument('--user_id', type=str, help='User ID')
    parser.add_argument('--organization_id', type=str, help='Organization ID')
    
    # 共通のオプション引数
    group = parser.add_argument_group("global optional arguments")
    group.add_argument('--yes', action="store_true", help="処理中に現れる問い合わせに対して、常に'yes'と回答します。")
    group.add_argument('--logdir', type=str, default=".log", help="ログファイルを保存するディレクトリを指定します。")
    
    ### 強引に移動させる
    help_action = parser._optionals._group_actions[0]  # optional グループの 0番目が help なので取り出す
    parser._optionals._group_actions = parser._optionals._group_actions[1:]  # 0番目を削除
    parser._action_groups[2]._group_actions.insert(0, help_action)  # global group の 先頭にhelpを追加
    ### 
    
    args = parser.parse_args()
    
[/code]

↓

[code]

    usage: sample.py [-h] [--project_id PROJECT_ID] [--user_id USER_ID]
                     [--organization_id ORGANIZATION_ID] [--yes] [--logdir LOGDIR]
    
    optional arguments:
      --project_id PROJECT_ID
                            Project ID
      --user_id USER_ID     User ID
      --organization_id ORGANIZATION_ID
                            Organization ID
    
    global optional arguments:
      -h, --help            show this help message and exit
      --yes                 処理中に現れる問い合わせに対して、常に'yes'と回答します。
      --logdir LOGDIR       ログファイルを保存するディレクトリを指定します。
    
[/code]


CC BY-SA 4.0
2019-08-12T04:48:44.503
57313
2019-08-12T04:48:44.503
35428
57298
answer