我尝试使用此语句:
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 时出现错误
您可以使用自定义操作:
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)
更简单。如果您有许多此类参数,那么定义自定义操作可以减少重复,并有助于确保所有这些参数都以相同的方式处理。