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

如何为Python成员变量添加描述、默认值等额外元信息?

为类成员变量添加元信息以生成动态对话框的方案

这里有几个实用的方案,帮你给类成员变量附加额外元信息,从而动态生成匹配的输入组件:

方案1:使用typing.Annotated(Python 3.9+ 推荐)

Annotated可以给类型提示绑定任意元数据,完美解决你需要给变量加描述、必填标记等需求,且不破坏原有类结构,还兼容静态检查工具。

实现代码

from typing import Annotated, get_type_hints

# 定义元数据类,统一管理需要的额外信息
class FieldMeta:
    def __init__(self, description: str = "", required: bool = False, is_password: bool = False, default=None):
        self.description = description
        self.required = required
        self.is_password = is_password
        self.default = default

# 业务类,用Annotated给变量绑定元信息
class UserForm:
    username: Annotated[str, FieldMeta(description="用户名", required=True)]
    age: Annotated[int, FieldMeta(description="年龄", default=18)]
    is_admin: Annotated[bool, FieldMeta(description="是否为管理员")]
    password: Annotated[str, FieldMeta(description="密码", is_password=True, required=True)]

# 解析类字段和元信息的函数
def parse_class_fields(cls):
    type_hints = get_type_hints(cls, include_extras=True)
    parsed_fields = []
    for field_name, hint in type_hints.items():
        if hasattr(hint, "__origin__") and hint.__origin__ is Annotated:
            field_type = hint.__args__[0]
            meta_data = hint.__args__[1]
            parsed_fields.append({
                "name": field_name,
                "type": field_type,
                "description": meta_data.description,
                "required": meta_data.required,
                "is_password": meta_data.is_password,
                "default": meta_data.default
            })
    return parsed_fields

# 测试解析结果
for field in parse_class_fields(UserForm):
    print(field)

方案2:使用dataclasses的field元数据

如果你本来就在用数据类,dataclasses.field自带的metadata参数可以直接存储自定义信息,解析起来也很方便。

实现代码

from dataclasses import dataclass, fields

@dataclass
class UserForm:
    username: str = fields(
        metadata={"description": "用户名", "required": True},
        default=""
    )
    age: int = fields(
        metadata={"description": "年龄", "default": 18},
        default=18
    )
    is_admin: bool = fields(
        metadata={"description": "是否为管理员"},
        default=False
    )
    password: str = fields(
        metadata={"description": "密码", "is_password": True, "required": True},
        default=""
    )

# 解析数据类字段的函数
def parse_dataclass_fields(cls):
    parsed_fields = []
    for field in fields(cls):
        meta = field.metadata
        parsed_fields.append({
            "name": field.name,
            "type": field.type,
            "description": meta.get("description", ""),
            "required": meta.get("required", False),
            "is_password": meta.get("is_password", False),
            "default": field.default
        })
    return parsed_fields

# 测试解析结果
for field in parse_dataclass_fields(UserForm):
    print(field)

方案3:自定义装饰器绑定变量元信息

如果需要兼容Python 3.9以下版本,可以用自定义装饰器给类变量直接绑定元信息属性。

实现代码

# 自定义装饰器,用来给变量附加元信息
def add_field_meta(**meta_kwargs):
    def decorator(var):
        var._meta = meta_kwargs
        return var
    return decorator

# 业务类,用装饰器标记变量
class UserForm:
    @add_field_meta(description="用户名", required=True)
    username: str = ""
    
    @add_field_meta(description="年龄", default=18)
    age: int = 18
    
    @add_field_meta(description="是否为管理员")
    is_admin: bool = False
    
    @add_field_meta(description="密码", is_password=True, required=True)
    password: str = ""

# 解析带装饰器的类字段的函数
def parse_decorated_fields(cls):
    parsed_fields = []
    for attr_name, attr_value in cls.__dict__.items():
        # 跳过私有属性,只处理带_meta的变量
        if not attr_name.startswith("_") and hasattr(attr_value, "_meta"):
            field_type = cls.__annotations__.get(attr_name)
            parsed_fields.append({
                "name": attr_name,
                "type": field_type,
                "description": attr_value._meta.get("description", ""),
                "required": attr_value._meta.get("required", False),
                "is_password": attr_value._meta.get("is_password", False),
                "default": attr_value
            })
    return parsed_fields

# 测试解析结果
for field in parse_decorated_fields(UserForm):
    print(field)

内容的提问来源于stack exchange,提问作者jordanthompson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 22:42:47