【发布时间】:2021-05-12 11:52:29
【问题描述】:
我有一个程序,它的参数可以从定义的列表中获取值。每个值只能传递一次。必须至少选择一个值。如果未选择任何值,则默认为选择所有值。以下代码展示了所需的行为。
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 获得与上述相同的行为,而不是对参数进行后期检查吗?
【问题讨论】:
-
如果您使用的是 Python 3.8 或更高版本,您可能需要查看
extend操作。否则,您可能想要使用append操作(这将使您多次使用--target,每个目标一次,而不是单个--targets选项)。最后,您可能会考虑定义一个自定义操作来处理在解析过程中删除重复项。 -
不错。我并没有真正理解文档的 Actions 部分,但您的建议让我看得更仔细。我会提供这个作为答案,但我会暂时搁置这个问题,希望得到其他答案。
标签: python command-line-arguments argparse