python - 正确的方法是使用类型提示/泛型来描述类型类 ("type"的参数)

标签 python python-3.x generics type-hinting

这似乎类似于 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/

相关文章:

python - 有没有办法在python中的整数范围内设置列表值

java - Java 中的泛型(和通配符)

python - 提高 kNN 分类器的性能(速度)

python - 编写一个递归函数,返回最长连续序列的数字

python - 如何使用 PySide、PyQt 创建像我们在 Photoshop 中看到的加载进度条

swift - 数组的通用扩展不起作用

Scala 泛型类型推断与 ClassTag 不一致

python - 如何使用 Python 3 将 JSON 文件转换为字典

python-3.x - tensorflow 2 api回归tensorflow.python.framework.ops.EagerTensor'对象不可调用

arrays - 如何在不出现格式错误的数组错误的情况下从数组列中进行选择