如何为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
相关产品推荐
相关产品推荐

