python - argparse:让相同的必需参数是位置或可选的

标签 python argparse

我希望将必需的命令行参数作为位置参数或可选参数传递。例如,我希望通过以下任何调用执行相同的操作:

prog 10
prog -10
prog -n 10
prog --num 10

这可以通过 argparse 实现吗?

最佳答案

通过互斥组,我可以创建一个合理的近似值:

在交互式 session 中:

In [10]: parser=argparse.ArgumentParser()
In [11]: grp=parser.add_mutually_exclusive_group(required=True)
In [12]: a=grp.add_argument('pos',nargs='?',type=int,default=0)
In [13]: b=grp.add_argument('-n','--num')

grp 可以包含任意数量的可选值和一个可选位置值。我为位置选择了不同的类型,只是为了突出显示差异。

只是位置值:

In [14]: parser.parse_args(['10'])
Out[14]: Namespace(num=None, pos=10)

各种形式的可选:

In [16]: parser.parse_args(['-n10'])
Out[16]: Namespace(num='10', pos=0)
In [17]: parser.parse_args(['--num=10'])
Out[17]: Namespace(num='10', pos=0)
In [18]: parser.parse_args(['--num','10'])
Out[18]: Namespace(num='10', pos=0)

测试团体排他性

In [25]: parser.parse_args(['--num=20','10'])
usage: ipython3 [-h] [-n NUM] [pos]
ipython3: error: argument pos: not allowed with argument -n/--num

所需的组:

In [26]: parser.parse_args([])
usage: ipython3 [-h] [-n NUM] [pos]
ipython3: error: one of the arguments pos -n/--num is required

我尝试为位置赋予与可选相同的 dest - 这样两者都会写入 num。但这会导致位置重写 dest 及其默认值(如果需要,我可以添加详细信息)

In [19]: a.dest
Out[19]: 'pos'
In [20]: a.dest='num'
In [21]: parser.parse_args(['--num','10'])
Out[21]: Namespace(num=0)

后解析代码必须以任何有意义的方式处理 args.posargs.num 值。

'-10' 输入无法处理。好吧,我可以定义:

parser.add_argument('-1')

但结果可能不是你想要的:

In [31]: parser.parse_args(['--num=20','-12'])
Out[31]: Namespace(1='2', num='20', pos=0)

总的来说,这个要求给程序员带来了不必要的困难。

关于python - argparse:让相同的必需参数是位置或可选的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39974093/

相关文章:

Python argparse : Lots of choices results in ugly help output

Python argparse 可选子参数

Python 参数解析 : Display parse_known_args mode in usage string

Python遍历嵌套字典

python - Django 中的层次结构权限

python字典keyError

python - python argparse中的多行帮助显示

python - Python 的 argparse 模块中具有混合类型 args 输入的参数解析器

Python 无法工作 - "Program ' python.exe' 无法运行”

python - 扩展 setuptools 扩展以在 setup.py 中使用 CMake?