python - 如何在 argparse 中将子解析器设置为可选?

标签 python python-3.x argparse python-2.6

import argparse

parser_sub = subparsers.add_parser('files')
parser_sub.add_argument(
'--file-name',
action='store',
dest='filename',
nargs='*')

options = parser.parse_args()

输出:错误:参数太少。

根据此链接:https://bugs.python.org/issue9253它指出子解析器不能是可选的。这种行为可以改变吗?

我希望我的子命令是可选的。如何通过 python 2.6 中的 argparse 实现此目的?

最佳答案

没有太多可以添加到该错误/问题 https://bugs.python.org/issue9253 .

subparsers 是一种特殊的位置参数。通常,使位置可选的唯一方法是使用 nargs='?' 参数。

正如错误问题中所详述的,在最近的版本中,子解析器已无意中成为可选的。这是解析器检查所需参数的方式发生变化的结果。

我不会说不可能将此行为改进到 2.6 版本中,但这不是只用一两个参数值就能完成的事情。我认为这需要很好地理解这个错误/问题。它要么需要对 parse_args 进行代码更改,要么需要自定义 subparser Action 类。


在早期版本中,丢失的子解析器字符串将被以下方式捕获:

    # if we didn't use all the Positional objects, there were too few
    # arg strings supplied.
    if positionals:
        self.error(_('too few arguments'))

其中positionals是位置操作的列表。当处理位置时,它将从此列表中删除。即使没有字符串,带有 ? 和 '*' 的操作也会被处理(因为接受空列表)。因此,没有看到 positionals 中留下的任何内容。

较新的版本放弃了此测试,代之以对 required 属性的测试(该属性已用于测试可选)。

关于python - 如何在 argparse 中将子解析器设置为可选?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35570139/

相关文章:

Python: Pyinstaller on mac 当前目录问题

python-3.x - 如果子标 checkout 现超过 1 次,如何将子标签移到母标签之后的右侧?

python - 使用 argparse 保持参数不变

python - 使用 argparse.ArgumentParser() 获取分组结构

python - 如何在流式查询中使用 MLlib 模型(失败并显示 "Field "功能“不存在。”)?

python - 如何表示具有多个属性的数据?

python-3.x - 在 Azure ML Studio 中执行 Python 脚本模块失败

python - 为什么使用使用 utf-8 编码的 Windows txt 文件时会出现 Json 的 ValueError 错误?

python - 将 argparse 传递给子进程

python - 让一个测试方法返回多个测试结果