能否从实例化的动态生成类自动生成pyi文件以实现代码补全?
动态生成类的Intellisense支持:自动生成pyi文件与stubgen的使用
我用以下代码从字典动态生成MyClass类:
class MyClass: def __init__(self, dictionary): for k, v in dictionary.items(): setattr(self, k, v)
我希望给这个动态生成的类添加Intellisense支持,已知多数IDE可以通过pyi存根文件实现,但不想手动编写pyi文件。有两个问题:
- 能否通过实例化该类,编程生成pyi文件并保存到磁盘?
- mypy的stubgen工具能否用于此场景?能不能导入stubgen并传入
MyClass实例进行处理?
一、通过实例编程生成pyi文件
完全可以。你可以遍历实例的运行时属性,提取属性名和对应类型,按照pyi文件格式生成代码后写入磁盘。
示例实现代码:
def generate_stub_from_instance(instance, stub_path="MyClass.pyi"): class_name = instance.__class__.__name__ attrs = [] for attr_name, attr_value in instance.__dict__.items(): # 基础类型处理 type_str = type(attr_value).__name__ # 优化容器类型的注解精度 if isinstance(attr_value, list) and attr_value: elem_type = type(attr_value[0]).__name__ type_str = f"list[{elem_type}]" elif isinstance(attr_value, dict) and attr_value: key_type = type(next(iter(attr_value.keys()))).__name__ val_type = type(next(iter(attr_value.values()))).__name__ type_str = f"dict[{key_type}, {val_type}]" attrs.append(f" {attr_name}: {type_str}") # 构建pyi文件内容 stub_content = f"""class {class_name}: def __init__(self, dictionary: dict) -> None: ... {chr(10).join(attrs)} """ # 写入磁盘 with open(stub_path, "w", encoding="utf-8") as f: f.write(stub_content) # 使用示例 sample_dict = {"name": "Alice", "age": 30, "hobbies": ["reading", "hiking"], "scores": {"math": 90, "english": 85}} obj = MyClass(sample_dict) generate_stub_from_instance(obj)
这段代码会根据实例属性生成带类型注解的pyi文件,IDE能识别这些属性提供Intellisense支持。你可以根据需求扩展逻辑,比如处理嵌套对象、可选类型等场景。
二、stubgen工具的适用性
stubgen是基于静态代码分析的工具,主要用于从已有的Python模块(.py文件)生成存根,无法直接传入类实例处理。因为它运行时不会执行代码,无法获取实例在运行时动态添加的属性。
如果用stubgen处理包含MyClass的模块,它只会生成基于静态代码的存根——也就是仅包含__init__方法的定义,不会包含动态添加的属性(这些属性在静态分析阶段不存在)。
因此stubgen不适合你的场景,实例驱动的生成方案更直接有效。
内容的提问来源于stack exchange,提问作者red888
相关产品推荐
相关产品推荐

