这似乎类似于 Type Hinting: Argument Of Type Class , 但是,那里接受的答案实际上并没有回答我的问题,所以可能问题表达不正确(?)
我有一个序列化/反序列化框架,可以从 [IDE 支持的] 类型提示中受益匪浅。 API 看起来像这样:
def serialize(obj:BaseModel) -> Dict[str,Any]:
""" Serialize the object to a dictionary. """
def deserialize(data:Dict[str,Any], clazz:type) -> BaseModel:
""" Deserialize dictionary into a model object of type clazz. """
序列化方法很好,但反序列化类型提示不是最优的。我想说明 deserialize 的返回值将是 clazz
类型的对象(它是 BaseModel
的子类)。这似乎像泛型可以提供帮助的东西,但我不确定如何表达我想要的东西。
T = TypeVar('T', bound=BaseModel)
def deserialize(data:Dict[str,Any], clazz:T) -> T:
""" Deserialize dictionary into a model object of type clazz. """
这似乎是错误的,因为 clazz 是从 T 派生的类,而不是类型 T 的对象(实例)。
我已经阅读了一些资料,但没有找到答案(用谷歌搜索这个特定问题也很棘手)。是否有明显的我在这里遗漏的东西,或者这只是 python 3.5 键入模块不支持?
诚然,我仍然受制于我的工具来推断类型,但希望如果有正确的方法来执行此操作,它将由类型检查实用程序实现。
最佳答案
既然一个类可以被认为是一个返回的可调用对象和它自己的实例,也许你可以尝试:
T = TypeVar('T', bound=BaseModel)
def deserialize(data: Dict[str, Any], clazz: Callable[..., T]) -> T:
""" Deserialize dictionary into a model object of type clazz. """
省略号 (...
) 表示类的调用签名未指定。因此,一个可调用对象接受未指定的参数并返回 T
的实例。
关于python - 正确的方法是使用类型提示/泛型来描述类型类 ("type"的参数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35655257/