如何使argparse从nargs=余数转换为split nargs='+'

2024-09-30 16:20:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用argparse将几个位置参数解析为input,然后将几个位置参数解析为output。由于中的参数数量没有界限,因此我尝试使用--作为分隔符。我通常使用nargs=argparse.REMAINDER成功地使用了--分隔符,因此我尝试了以下方法:

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("input", nargs='+')
parser.add_argument("output", nargs=argparse.REMAINDER)

args = parser.parse_args("input1 input2 -- output1 outpu2".split())
print(args)

但是,所有参数都放在input中,我得到以下输出:

Namespace(input=['input1', 'input2', 'output1', 'outpu2'], output=[])

--已正确使用,但它不充当分隔符

有没有办法用argparse来实现这一点


Tags: addparserinputoutput参数argparseargsargument
2条回答

不,没有用于将命名(“可选”)参数与位置参数分开,而不是将位置参数拆分为子段。这就是为什么文档会说(加上强调;引用自nargs='*',但除了'+'至少需要一个参数外没有区别):

'*' All command-line arguments present are gathered into a list. Note that it generally doesn’t make much sense to have more than one positional argument with nargs='*', but multiple optional arguments with nargs='*' is possible.

为什么不定义一个标志 output(使用nargs='+'甚至nargs='*'),并使用更明确的

input1 input2  output output1 output2

(如果需要键入八个字符,请使用短标志名。)

您可以定义一个自定义操作,该操作负责使用(几乎)任何您喜欢的分隔符将参数集划分为输入和输出文件

import argparse


class PartitionedValues(argparse.Action):
    def __init__(self, *args, delim="+++", **kwargs):
        super().__init__(*args, **kwargs)
        self.delim = delimiter

    def __call__(self, parser, namespace, values, option_string):
        files = namespace.input = []
        namespace.output = []
        for f in values:
            if f == self.delim:
                files = namespace.output
            else:
                files.append(f)


p = argparse.ArgumentParser()
p.add_argument("files", action=PartitionedValues, nargs='+')
args = p.parse_args()
print(args.input)
print(args.output)

然后一个电话

script.py file1 file2 +++ file3 file4

会产生

['file1', 'file2']
['file3', 'file4']

作为输出。(注意本身,以及显然以开头的任何内容,都会触发files参数的处理结束,因此我使用了+++ 作为默认分隔符。)

我还根据每个选项配置了分隔符。您可以将files参数的定义更改为

p.add_argument("files", action=PartitionedValues, delim="+=+", nargs="+")

然后用

script.py file1 file2 +=+ file3 file4

以获得相同的输出

相关问题 更多 >