0
Help us understand the problem. What are the problem?

posted at

updated at

Organization

argparse:ArgumentParserコンストラクタ引数parentsに、相互排他グループを含む引数グループを渡すと、正しくグループ化されない

環境

  • Python 3.9.7
    • argparse 1.1

やりたいこと

argparseモジュールを使ってCLIを作っています。

以下のように、相互排他グループ(--foo or --bar)を含む引数グループ"global options"を作成したいです。

foo.py
import argparse

def add_parser(parser):
    argument_group = parser.add_argument_group("global options")
    argument_group.add_argument("--xxx")
    argument_group.add_argument("--yyy")

    exclusive_group = argument_group.add_mutually_exclusive_group()
    exclusive_group.add_argument("--foo", action="store_true")
    exclusive_group.add_argument("--bar", action="store_true")

def main():
    parser = argparse.ArgumentParser(description="test")
    parser.add_argument("integers", type=int, nargs="+")
    add_parser(parser)
    args = parser.parse_args()


if __name__ == "__main__":
    main()
$ python foo.py -h
usage: foo.py [-h] [--xxx XXX] [--yyy YYY] [--foo | --bar] integers [integers ...]

test

positional arguments:
  integers

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

global options:
  --xxx XXX
  --yyy YYY
  --foo
  --bar

発生した問題

"global options"という引数グループは、他のコマンドでも利用するコマンドライン引数なので、ArgumentParserコンストラクタ引数parentsに設定したいです。

def main():
    parent_parser = argparse.ArgumentParser(add_help=False)
    add_parser(parent_parser)
    parser = argparse.ArgumentParser(description="test", parents=[parent_parser])
    parser.add_argument("integers", type=int, nargs="+")

    args = parser.parse_args()
$ python foo.py -h
usage: foo.py [-h] [--xxx XXX] [--yyy YYY] [--foo | --bar] integers [integers ...]

test

positional arguments:
  integers

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

global options:
  --xxx XXX
  --yyy YYY

しかしヘルプを見ると、相互排他グループである--foo, --barは、global optionsでなくデフォルトのoptional argumentsに含まれていました。

原因

分かりませんでした。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
0
Help us understand the problem. What are the problem?