将命令行参数归因于多个参数
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
的情况下,然后 a
,b
和 c
将被打印出来。
现在,我得到的是 foo
仅打印 a
和 bar
仅在 case 1
中存储 b
和 c
并且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)
将打印 a
、b
和 c
,而在第二种情况下则不会。
您不能(轻易地)欺骗 argparse
重用 argv
字符串。解析器为 Actions 分配值。
默认的nargs
是None
,也就是说,使用下一个字符串作为参数。
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.
另一种选择是给 foo
和 bar
一个 *
,并让 foo
打印并保存到 bar
dest
.然后 foo
将消耗所有后续字符串。但是,如果 bar
没有任何可保存的内容,它可能会将 []
写入命名空间。
无论如何,你能做的最好的就是伪造重复使用。
另一个想法是使用 2 个不同的解析器 parse_known_args
。解析器不会弄乱 sys.argv
,因此它可以多次读取和解析。
我正在尝试构建一个命令行解析器,它将能够在参数之间共享传递的值,以避免必须多次键入它们。换句话说,我希望两个参数的名称空间相同:
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
的情况下,然后 a
,b
和 c
将被打印出来。
现在,我得到的是 foo
仅打印 a
和 bar
仅在 case 1
中存储 b
和 c
并且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)
将打印 a
、b
和 c
,而在第二种情况下则不会。
您不能(轻易地)欺骗 argparse
重用 argv
字符串。解析器为 Actions 分配值。
默认的nargs
是None
,也就是说,使用下一个字符串作为参数。
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.
另一种选择是给 foo
和 bar
一个 *
,并让 foo
打印并保存到 bar
dest
.然后 foo
将消耗所有后续字符串。但是,如果 bar
没有任何可保存的内容,它可能会将 []
写入命名空间。
无论如何,你能做的最好的就是伪造重复使用。
另一个想法是使用 2 个不同的解析器 parse_known_args
。解析器不会弄乱 sys.argv
,因此它可以多次读取和解析。