【问题标题】:How can I set a subparser to be optional in argparse?如何在 argparse 中将子解析器设置为可选?
【发布时间】:2016-06-04 20:28:37
【问题描述】:
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 实现这一点?

【问题讨论】:

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


    【解决方案1】:

    没有太多可以添加到该错误/问题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 属性的测试(该属性已被用于测试 optionals)。

    【讨论】:

    • 你能帮忙解释一下如何使用'nargs'来拥有可选参数
    • 我应该补充一点,add_subparsers 产生一个具有特殊 nargs='A...' 值的参数。在不破坏子解析器机制的情况下无法更改。
    猜你喜欢
    • 2012-01-21
    • 1970-01-01
    • 2012-06-21
    • 2013-12-21
    • 1970-01-01
    • 1970-01-01
    • 2020-09-26
    • 2019-05-04
    相关资源
    最近更新 更多