Python中使用argparse出现invalid choice错误问题求助
问题解决
你的代码存在两个关键错误,导致输入red时出现无效值错误:
1. Enum枚举定义错误
原代码中枚举成员列表的写法有误:
Color = Enum("Color", ["red", "green," "blue"])
这里"green," "blue"会被Python自动拼接成单个字符串"green,blue",导致枚举实际只有两个成员:red和green_blue(枚举会自动将非标识符字符转为下划线)。正确的写法应该是用逗号分隔三个独立的字符串:
Color = Enum("Color", ["red", "green", "blue"])
2. argparse类型转换错误
直接将type=Color传给add_argument会导致argparse调用Color("red"),而Enum的构造函数是按成员的value(默认是整数1、2、3)查找,不是按name(字符串"red")查找,因此会报错。需要自定义类型转换逻辑,通过成员名称获取枚举实例。
修正后的完整代码
from argparse import ArgumentParser from enum import Enum Color = Enum("Color", ["red", "green", "blue"]) def parse_color(s): try: return Color[s] except KeyError: raise ValueError(f"invalid Color value: '{s}'") parser = ArgumentParser() parser.add_argument("color", type=parse_color, choices=list(Color)) args = parser.parse_args() print(f"your color is {args.color}") class test: def __init__(self): self.a = 1 self.b = 2
更简洁的写法
可以用lambda表达式替代自定义函数:
parser.add_argument("color", type=lambda s: Color[s], choices=list(Color))
现在执行python test.py red,就能正常输出your color is Color.red了。
内容的提问来源于stack exchange,提问作者user21208477
相关产品推荐
相关产品推荐

