python - 如何在 argparse 中将可选位置参数与 nargs ='*' 参数一起使用?

标签 python parsing argparse optparse optional-arguments

如下面的代码所示,我想要一个可选的位置参数files,我想为其指定一个默认值,当传入路径时,使用指定的路径。

但是因为 --bar 可以有多个参数,所以传入的路径没有进入 args.files,我该如何解决这个问题?谢谢!

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--foo')
parser.add_argument('--bar', nargs='*')
parser.add_argument('files', nargs='?')

cmd = '--foo a --bar b c d '
print parser.parse_args(cmd.split())
# Namespace(bar=['b', 'c', 'd'], files=None, foo='a')


cmd = '--foo a --bar b c d /path/to/file1'
print parser.parse_args(cmd.split())
# Namespace(bar=['b', 'c', 'd', '/path/to/file1'], files=None, foo='a')

最佳答案

你的参数规范本质上是不明确的(因为--bar可以接受无限参数,所以没有好的方法来判断它何时结束,特别是因为files是可选的) ,因此需要用户消歧。具体来说,通过将 -- 放在仅位置部分之前,可以告诉 argparse“这是开关部分的结尾,所有后续参数都是位置的”。如果您这样做:

cmd = '--foo a --bar b c d -- /path/to/file1'
print parser.parse_args(cmd.split())

你应该得到:

Namespace(bar=['b', 'c', 'd'], files='/path/to/file1', foo='a')

(在 Py3 上测试,但也应适用于 Py2)

或者,用户可以通过避免将位置参数放在 --bar 之后,将位置参数传递到任何明确的位置,例如:

cmd = '/path/to/file1 --foo a --bar b c d'

cmd = '--foo a /path/to/file1 --bar b c d'

最后,您可以避免使用 nargs='*' 作为开关,因为它会带来歧义。相反,定义 --bar 被多次接受,每个开关使用一个值,将所有使用累积到一个列表:

parser.add_argument('--bar', action='append')

然后多次传递 --bar 来一次提供多个值,而不是一次传递多个值:

cmd = '--foo a --bar b --bar c --bar d /path/to/file1'

关于python - 如何在 argparse 中将可选位置参数与 nargs ='*' 参数一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40033261/

相关文章:

python - 将值 append 到字典中的一个列表将值 append 到字典中的所有列表

java - 是否有提供 LDAP 样式解析的独立 Java 库?

python - 使用 argparse 调用不同的函数

python - 一个不需要位置参数的可选参数

python - Ruby optparse 限制

python - 如何根据用户输入更改 Django 查询查找

python - 使用 pip 安装名为 "dbt"的包时遇到问题

python - 如何在 python 中编码/解码转义序列字符

java - 如何从 Java 中格式错误的字符串中获取属性和值

mysql - 转义 Node.JS MySQL 问题