我正在尝试在argparse
中添加选项选项。
目前我有:
group = parser.add_mutually_exclusive_group()
group.add_argument("--md", help="Create xyz file for each ionic step for"
" visualization", action='store_true')
group.add_argument("--force", help="See which atom has maximum force",
action='store_true')
group.add_argument("--opt", help="grep string from file",
nargs=2, metavar=("str", "file"))
parser.add_argument("--xsf", help="Create xsf file for md(default is xyz)"
" visualization", action='store_true')
parser.add_argument("-N", help="Showing first N line",
metavar='integer', type=int)
parser.add_argument("-n", help="Showing last n line",
metavar='integer', type=int)
args = parser.parse_args()
给出:
./foo.py --h
usage: foo.py [-h]
[--md | --force | --opt str file]
[--xsf] [-N integer] [-n integer]
但我希望--xsf
作为--md
的子选项,-N,-n
作为--opt
; e.g。
./foo.py --h
usage: foo.py [-h]
[--md [--xsf]| --force | --opt str file [-N integer] [-n integer]]
但我不知道如何实现这一目标。可能是我遗漏了一些东西,但argparse doc
中没有这样的选项还有其他办法吗?
答案 0 :(得分:2)
mutually_exclusive_group
机制非常简单,不适用于任何类型的嵌套或子分组。
有一个Python错误/问题要求更全面的分组机制,但提议的补丁相当复杂。问题不在于测试,而是以用户友好的方式定义组,并生成usage
行。包含所需用法很不错,但这种格式远远超出了当前帮助格式化程序的功能。
你可能会把你的问题重新塑造为一个子问题。 subparsers是互斥的(你只能给一个命令名),你可以指定--xsf
作为md
的参数,-N
作为--opt
的参数。但是,subparsers有自己的帮助问题。
另一种方法是编写自己的usage
,并在解析后自行测试参数。通过适当选择默认值,您通常可以判断是否已提供参数(用户无法指定None
),或者您可以忽略不必要的参数。