如何解决使用 argparse 从选择中获取唯一值列表
我有一个程序,它的参数可以从定义的列表中获取值。每个值只能传递一次。必须至少选择一个值。如果未选择任何值,则默认为选择所有值。以下代码展示了所需的行为。
import argparse
############################# Argument parsing
all_targets = ["bar","baz","buzz"]
p = argparse.ArgumentParser()
p.add_argument(
"--targets",default=all_targets,choices=all_targets,nargs="+",)
args = p.parse_args()
targets = args.targets
if len(targets) > len(set(targets)):
raise ValueError("You may only foo every target once!")
############################## Actual program
for target in targets:
print(f"You just foo'ed the {target}!")
但是,现在我在解析后处理参数验证,这似乎是一种反模式,因为 argparse 通常在解析步骤中进行类型验证等。
我能否从 ArgumentParser
获得与上述相同的行为,而不是对参数进行事后检查?
解决方法
@chepner 提供了一些替代方案。对我来说最自然的是使用 Actions。合并 unicity-check 可以按如下方式完成:
import argparse
class CheckUniqueStore(argparse.Action):
"""Checks that the list of arguments contains no duplicates,then stores"""
def __call__(self,parser,namespace,values,option_string=None):
if len(values) > len(set(values)):
raise argparse.ArgumentError(
self,"You cannot specify the same value multiple times. "
+ f"You provided {values}",)
setattr(namespace,self.dest,values)
############################# Argument parsing
all_targets = ["bar","baz","buzz"]
p = argparse.ArgumentParser()
p.add_argument(
"--targets",default=all_targets,choices=all_targets,nargs="+",action=CheckUniqueStore,)
args = p.parse_args()
############################## Actual program
for target in args.targets:
print(f"You just foo'ed a {target}!")
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。