如何初始化空值类变量并按定义顺序输出变量名列表?
问题原因
Python 的 Enum 类有个特性:如果多个枚举成员的值完全相同,后面的成员会被视为前面成员的别名,不会被纳入枚举的正式成员集合中,这就是你设置空字符串后只输出第一个变量名的原因。
解决方案
方案1:调整 Enum 实现,确保成员值唯一
如果想继续用 Enum,只需让每个成员的值保持唯一即可。不需要修改业务逻辑的话,可以用object()生成唯一占位对象,或者给空字符串追加索引标识:
方式A:用唯一占位对象
from enum import Enum class MyVars(Enum): VAR1 = "" VAR2 = object() # 每个成员用唯一的空对象作为值 VAR3 = object() # 按定义顺序输出变量名数组 var_names = [member.name for member in MyVars] print(var_names) # 输出: ['VAR1', 'VAR2', 'VAR3']
方式B:动态生成唯一值
如果需要成员对外展示的是空字符串,可以在构造函数里处理,内部用唯一值区分:
from enum import Enum class MyVars(Enum): VAR1 = "" VAR2 = "" VAR3 = "" def __init__(self, _): # 用成员名的索引生成唯一内部值,避免别名问题 self._value_ = f"_{self.name}_" @property def value(self): # 对外暴露空字符串 return "" # 输出变量名数组 var_names = [member.name for member in MyVars] print(var_names) # 输出: ['VAR1', 'VAR2', 'VAR3']
方案2:放弃 Enum,用更直接的方式
如果 Enum 不是必须的,以下两种方案更简单直观:
方式A:用列表+字典维护变量与顺序
直接通过列表定义顺序,同时初始化变量:
# 按定义顺序存储变量名和对应值 var_definitions = [ ("VAR1", ""), ("VAR2", ""), ("VAR3", "") ] # 初始化变量到全局命名空间(如果需要局部则用locals()) for name, value in var_definitions: globals()[name] = value # 直接提取变量名数组 var_names = [name for name, _ in var_definitions] print(var_names) # 输出: ['VAR1', 'VAR2', 'VAR3']
方式B:用普通类+inspect模块
利用Python 3.7+保留类属性定义顺序的特性,结合inspect筛选成员:
import inspect class MyVars: VAR1 = "" VAR2 = "" VAR3 = "" # 筛选出非私有、非方法的类属性,按定义顺序输出 members = inspect.getmembers(MyVars, lambda attr: not inspect.isroutine(attr)) var_names = [name for name, _ in members if not name.startswith('_')] print(var_names) # 输出: ['VAR1', 'VAR2', 'VAR3']
内容的提问来源于stack exchange,提问作者Rajat
相关产品推荐
相关产品推荐

