通过Jinja2代码生成实现带智能提示的多属性Python Enum
解决方案:生成可被IntelliSense识别的带属性Enum类
核心思路
要让IntelliSense能识别Enum成员的id、label等属性,关键是显式定义Enum基类的属性类型,同时让每个生成的枚举类基于该基类静态声明成员与属性,静态分析工具就能准确识别这些属性。
步骤1:定义带类型注解的Enum基类
先创建一个通用基类,通过类型注解明确属性类型,同时处理初始化逻辑:
from enum import Enum from typing import Union, Any class BaseLabeledEnum(Enum): def __init__(self, enum_id: Union[int, str], label: str, **kwargs: Any): self.id = enum_id self.label = label # 处理额外扩展属性(如hors_methode) for key, value in kwargs.items(): setattr(self, key, value)
基类里的类型注解会直接被IntelliSense读取,明确告知工具每个枚举成员都具备id、label属性,同时支持扩展其他自定义属性。
步骤2:用Jinja2模板生成静态枚举类
针对Excel中的每个枚举表,使用如下模板生成代码:
{% for enum_def in enum_definitions %} class {{ enum_def.class_name }}(BaseLabeledEnum): {% for member in enum_def.members %} {{ member.name }} = ({{ member.id | repr }}, {{ member.label | repr }} {%- if member.extra_attrs %}, {{ member.extra_attrs | items | map('repr') | join(', ') }}{% endif -%} ) {% endfor %} {% endfor %}
示例生成结果
比如包含hors_methode属性的枚举表,生成的代码会是:
class LogementType(BaseLabeledEnum): APPARTEMENT = (1, "Appartement", hors_methode=False) MAISON_INDIVIDUELLE = (2, "Maison individuelle", hors_methode=False) LOCAL_HORS_METHODE = ("99", "Local non pris en compte", hors_methode=True)
步骤3:生成代码的细节优化
- 枚举成员名称(如
APPARTEMENT)可从Excel标识列转换而来:大写化、替换特殊字符为下划线,保证符合Python命名规范 - 用
repr()处理所有属性值,确保字符串、整数等类型在生成代码时格式正确 - 额外属性以关键字参数形式传入,IntelliSense会结合生成的静态代码识别具体属性
方案有效性说明
- 基类的类型注解为IntelliSense提供了属性的明确类型信息
- 生成的枚举类是静态定义的,而非元类动态创建,静态分析工具可直接解析成员与属性
- 扩展属性通过关键字参数传入,既保留了灵活性,又能让工具通过生成的代码感知属性存在
内容的提问来源于stack exchange,提问作者Lionel du Peloux
相关产品推荐
相关产品推荐

