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

How can I set a subparser to be optional in argparse?

import argparse

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

options = parser.parse_args()

输出:错误:参数太少。

根据这个 link:https://bugs.python.org/issue9253 它声明子解析器不能是可选的。可以更改此行为吗?

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

没有什么可以补充的了 bug/issue https://bugs.python.org/issue9253.

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

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

我不会说不可能将此行为改进到 2.6 版本中,但这不是仅用一两个参数值就可以做到的事情。我认为这需要对此有很好的理解 bug/issue。它要么需要将代码更改为 parse_args,要么可能需要自定义 subparser 操作 class.


在早期版本中,缺少的子解析器字符串将被捕获:

    # 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 属性的测试(该属性已用于测试 optionals)。