动态创建子类的类型注解

Type annotations for dynamically created subclasses

我想在启动时使用 type() 函数动态创建子 类。一切都按预期工作。 我知道这不是很好,但我受制于一个框架并且必须这样做。另一种选择是生成源代码...

功能等同于我的代码:

class BaseEntity:
    id: str


def make_new_entity(name: str, attrs: dict) -> type:
    return type('RuntimeEntity', (BaseEntity,), attrs)


RuntimeEntity: ??? = make_new_entity('RuntimeEntity', {'id': 'entity.RuntimeEntity'})

有没有办法提供对返回类型的绑定?基本上相当于

E = TypeVar('E', bound='BaseEntity')

我也看过 types 模块。

感谢您的帮助!

typing.Type 允许您指定值应该是实际类型,而不是该类型的实例。

from typing import Type

class BaseEntity:
    id: str


def make_new_entity(name: str, attrs: dict) -> Type[BaseEntity]:
    return type('RuntimeEntity', (BaseEntity,), attrs)


RuntimeEntity: Type[BaseEntity] = make_new_entity('RuntimeEntity', {'id':     'entity.RuntimeEntity'})

类型 Type[BaseEntity] 的值可以是 BaseEntity 本身,或任何继承自 BaseEntity 的 class。 (描述这个的术语是协方差。如果Type不变Type[BaseEntity]会接受BaseEntity仅自身。)