为何使用类来定义有效参数集合?
你提到的这种用空类存储常量的写法,在Python里非常常见,相比直接用集合、列表或元组,它有这些实际的好处:
1. 可读性强,还能避免拼写错误
直接写"ARG1"这类硬编码字符串属于「魔法值」,其他人看代码很难直观理解它的含义。但用ArgumentOption.ARG1的话,一眼就能明白这是某个参数的合法选项,而且编辑器会自动补全属性名,不会出现手滑打错字符串的问题——比如把"ARG1"写成"ARGl",这类错误编译器不会提示,但用类属性的话,打错名字直接会报「找不到属性」的错误。
2. 统一维护,修改成本低
如果某个参数的值需要调整,比如把ARG3 = 3改成ARG3 = 30,只要在类里修改这一处,所有引用该属性的地方都会自动同步。要是用硬编码的数字,你得全局搜索所有写3的位置,还容易漏改或改错。
3. 自带命名空间,避免冲突
不同业务的参数选项可以用不同的类封装,比如UserStatus和OrderStatus,各自的属性不会互相干扰。但如果用全局集合,比如USER_STATUS = {"ACTIVE", "INACTIVE"}和ORDER_STATUS = {"ACTIVE", "INACTIVE"},虽然变量名不同,但不如类的隔离感清晰,还容易不小心写错集合名。
4. 方便做参数校验
要判断用户输入的参数是否合法,直接检查值是否在ArgumentOption.__dict__.values()里即可,甚至可以给类加个静态方法专门做校验:
class ArgumentOption: ARG1 = "ARG1" ARG2 = "ARG2" ARG3 = 3 @staticmethod def is_valid(opt): return opt in {v for k, v in ArgumentOption.__dict__.items() if not k.startswith('_')}
比单独维护一个校验用的集合灵活得多,后续新增选项也不用同步修改校验逻辑。
为啥函数能直接接收字符串/整数?
因为这个类里的属性本质就是字符串或整数,你传ArgumentOption.ARG1其实就是传字符串"ARG1",所以函数不需要接收类的实例,直接接收对应类型的值就行。这种写法相当于用类做了个「常量容器」,既享受了类带来的命名空间、可读性和可维护性,又不影响函数的通用性——函数照样能接收手动输入的合法值,只是用类属性的方式更规范。
内容的提问来源于stack exchange,提问作者Landscape

