【问题标题】:why parseargs stores the argument inside a list为什么 parseargs 将参数存储在列表中
【发布时间】:2023-10-31 20:27:02
【问题描述】:

我有一个给定字符串的 argparse:

def f():
    return 'dummy2'

p = argparse.ArgumentParser()
p.add_argument('--a', nargs=1, type=str)
p.add_argument('--b', nargs='?', const=f(), default=f())
p.parse_args('--a dummy'.split())

解析器命名空间是Namespace(a=['dummy'], b='dummy2')

如何将a 的参数存储为字符串而不是字符串列表?

【问题讨论】:

    标签: python string python-2.7 argparse


    【解决方案1】:

    很简单,只需跳过nargs 的参数即可。试试这个:

    p = argparse.ArgumentParser()
    p.add_argument('--a', type=str)
    p.add_argument('--b', nargs='?', const=f(), default=f())
    

    我相信这是你所期望的:

    p.parse_args('--a dummy'.split())
    => Namespace(a='dummy', b='dummy2')
    

    引用docs

    ArgumentParser 对象通常将单个命令行参数与要执行的单个操作相关联。 nargs 关键字参数将不同数量的命令行参数与单个操作相关联。支持的值为:

    N(整数)。来自命令行的 N 个参数将被收集到一个列表中……请注意,nargs=1 会生成一个包含一项的列表。这与默认情况下不同,默认情况下该项目是由自己生成的。

    【讨论】:

    • 你能解释一下吗?我认为nargs 1 应该强制只给出一个参数,当我提供正确的字符串时基本上什么都不做
    • 好吧,没关系...刚刚看到这个('请注意,nargs=1 生成一个项目的列表。这与默认值不同,默认情况下该项目是由它自己生成的。')。
    • 是的,它在文档中,我更新了我的答案以反映它