python - 每个位置参数的可选参数

标签 python argparse

使用 argparse(或其他东西?)我希望每个位置参数都有一个带有默认值的可选参数。

参数将是这样的:

script.py arg1 arg2 -o 1 arg3 -o 2 arg4 arg5

我希望它将其解析为可用的东西,例如位置参数列表和可选参数列表填充了默认值。例如如果在上面的示例中可选的默认值为 0:

positional = [arg1, arg2, arg3, arg4, arg5]
optional = [0, 1, 2, 0, 0]

换句话说,parser.add_argument('-o', action='append') 不是我想要的,因为我失去了位置参数,每个可选参数都关联到。

最佳答案

这是我整理的一个简单技巧,可能是一个合理的起点:

import argparse

class PositionalAction(argparse.Action):
    def __call__(self,parser,namespace,values,option_string=None):
        lst = getattr(namespace,self.dest)
        lst.append(values)
        parser.last_positional_values = lst
        all_positional = getattr(namespace,'all_positional',[])
        all_positional.append(lst)
        namespace.all_positional = all_positional

class AssociateAction(argparse.Action):
    def __call__(self,parser,namespace,values,option_string=None):
        try:
            parser.last_positional_values.append(values)
        except AttributeError:
            pass

parser = argparse.ArgumentParser()
parser.add_argument('-o',action=AssociateAction,dest=argparse.SUPPRESS)
junk,unknown = parser.parse_known_args()

for i,_ in enumerate(unknown):
    parser.add_argument('arg%d'%i,action=PositionalAction,default=[])

print parser.parse_args()

这是实际操作:

temp $ python test1.py foo -o 1 bar -o 2 baz qux -o 4
Namespace(all_positional=[['foo', '1'], ['bar', '2'], ['baz'], ['qux', '4']], arg0=['foo', '1'], arg1=['bar', '2'], arg2=['baz'], arg3=['qux', '4'])

这个问题有一些挑战。首先,您想接受任意数量的位置参数——argparse 不喜欢这样。 argparse 想预先知道会发生什么。解决方案是构建一个解析器并解析命令行,但告诉 argparse 只解析已知参数(在这种情况下,非位置 -o 参数都被静默解析,但“位置"参数未被解析。)。 parse_known_args 非常适合此操作,因为它以 (namespace_of_parsed_stuff, uknown_args) 的形式返回一个元组。所以现在我们知道了未知参数——我们只需要为每个参数向解析器添加一个位置参数,以使 parse_args 满意。

现在,自定义操作实际上在做什么?当找到位置参数时(在第二遍),我们得到默认值(这是一个列表)并将值添加到该列表(此后我将其称为“值”列表)。然后,我们使用对“值”列表的引用修改解析器。我们还从命名空间中获取“all_positional”列表。如果它没有那个属性,我们只会得到一个空列表。我们将“value”列表添加到“all_positional”列表并将其放回命名空间。

现在,当我们点击 -o 标志时,我们查看解析器以获取“值”列表,并将附加值添加到该列表。我们可以在完全不接触解析器的情况下做同样的事情……(我们可以查看 namespace.all_positional[-1] -- 它与 parser.last_positional_values 相同的列表>).

关于python - 每个位置参数的可选参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14402837/

相关文章:

python - 本地语言的时区名称

python - 无法加载 dynlib/dll (Pyinstaller)

python - 如何管理 argparse 中的优先级?

python - 主管 - 如何运行多个命令

python - 从 Python 更新 proc 条目的推荐方法是什么

python - 使 Python 的 argparse 执行默认操作

Python:Argparse - 必需和可选参数

python - 查找 argparse python3 中参数的顺序

Python 命令行脚本。两种使用场景。如何实现参数解析?

python - 尝试导入测试床时出错