You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何初始化空值类变量并按定义顺序输出变量名列表?

问题原因

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 22:37:27