将命令行参数归因于多个参数

Attribution of command line parameter to multiple arguments

我正在尝试构建一个命令行解析器,它将能够在参数之间共享传递的值,以避免必须多次键入它们。换句话说,我希望两个参数的名称空间相同:

import argparse

class PrintAction(argparse.Action):
    def __init__(self, option_strings, dest, **kwargs):
        super(PrintAction, self).__init__(option_strings, dest, **kwargs)

    def __call__(self, parser, namespace, values, option_string=None):
        for val in values:
            print(val)

parser = argparse.ArgumentParser(description='A foo that foos and a bar that bars')
parser.add_argument('--foo', action=PrintAction)
parser.add_argument('bar', nargs='+')

args = parser.parse_args(['--foo', 'a', 'b', 'c']) # Case 1
args = parser.parse_args(['a', 'b', 'c']) # Case 2

然后我想要一个解决方案,在两种情况下都将 ['a', 'b', 'c'] 存储在 bar 中,而且在提供 --foo 的情况下,然后 abc 将被打印出来。

现在,我得到的是 foo 仅打印 abar 仅在 case 1 中存储 bc 并且case 2.

中的正确结果

您需要将 --foo 设为布尔标志。现在它是一个字符串参数,因为您没有另外说明。将 action 设置为 store_true 以获得布尔标志效果。

最终的解决方案如下:

def print_args(args):
    if args.foo:
        for val in args.bar:
            print(val)

parser = argparse.ArgumentParser(description='A foo that foos and a bar that bars')
parser.add_argument('--foo', action='store_true')
parser.add_argument('bar', nargs='+')

args = parser.parse_args(['--foo', 'a', 'b', 'c']) # Case 1
args = parser.parse_args(['a', 'b', 'c']) # Case 2

然后在第一种情况下调用 print_args(args) 将打印 abc,而在第二种情况下则不会。

您不能(轻易地)欺骗 argparse 重用 argv 字符串。解析器为 Actions 分配值。

默认的nargsNone,也就是说,使用下一个字符串作为参数。

parser.add_argument('--foo')

将设置 foo='a'bar=['b','c']

在您的操作中,values 将是您打印的 ['a']。在 optparse 中,每个选项都获得剩余的 argv 列表,它可以根据需要使用该列表。在 argparse 中,它只得到其 nargs 要求的 values

您可以在 __init__ 中指定 nargs=0,然后从 sys.argv 打印。等效地,正如@9000 所建议的那样,将其设为 store_true 并在解析后打印。查看 store_true 操作的代码 class.

另一种选择是给 foobar 一个 *,并让 foo 打印并保存到 bar dest.然后 foo 将消耗所有后续字符串。但是,如果 bar 没有任何可保存的内容,它可能会将 [] 写入命名空间。

无论如何,你能做的最好的就是伪造重复使用。


另一个想法是使用 2 个不同的解析器 parse_known_args。解析器不会弄乱 sys.argv,因此它可以多次读取和解析。