argparse:nargs='*' 的默认值?

kar*_*rim 5 python argparse

我尝试使用此语句:

parser = argparse.ArgumentParser()
parser.add_argument('-m', '--music', nargs='*', default=False, const=True)
args = parser.parse_args()
print(args.music)
Run Code Online (Sandbox Code Playgroud)

但是得到了这个错误:

`builtins.ValueError: nargs must be '?' to supply const`
Run Code Online (Sandbox Code Playgroud)

我想做的是:

  • 如果 -m在 args 列表中但没有任何值,args.music 会给我 True
  • 如果 -m在 args 列表中并且有“N”个值,args.music 会给我一个所有值的列表
  • 如果 -m不在 args 列表中,args,music 将返回 False

第二个和最后一个有效,但是当我尝试使用 const 时出现错误

unu*_*tbu 4

您可以使用自定义操作

import argparse
class EmptyIsTrue(argparse.Action):
    def __call__(self, parser, namespace, values, option_string=None):
        if len(values) == 0:
            values = True
        setattr(namespace, self.dest, values)

parser = argparse.ArgumentParser()
parser.add_argument('-m', '--music', nargs='*', default=False, action=EmptyIsTrue)
print(parser.parse_args([]))
# Namespace(music=False)

print(parser.parse_args(['-m']))
# Namespace(music=True)

print(parser.parse_args('-m 1 2'.split()))
# Namespace(music=['1', '2'])
Run Code Online (Sandbox Code Playgroud)

如果您只有一个参数需要以这种方式处理,那么

arg.music = True if len(arg.music) == 0 else arg.music
Run Code Online (Sandbox Code Playgroud)

更简单。如果您有许多此类参数,那么定义自定义操作可以减少重复,并有助于确保所有这些参数都以相同的方式处理。