LoginSignup
0
0

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-01-07

環境

  • 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に含まれていました。

原因

分かりませんでした。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0