Python 使用类型提示/泛型来描述类型类(“type”)的参数的正确方法
这似乎类似于,但是,那里被接受的答案实际上并没有回答我的问题,因此,可能问题表达不正确(?) 我有一个序列化/反序列化框架,它将从[IDE支持的]类型暗示中受益匪浅。API的外观如下所示:Python 使用类型提示/泛型来描述类型类(“type”)的参数的正确方法,python,python-3.x,generics,typing,Python,Python 3.x,Generics,Typing,这似乎类似于,但是,那里被接受的答案实际上并没有回答我的问题,因此,可能问题表达不正确(?) 我有一个序列化/反序列化框架,它将从[IDE支持的]类型暗示中受益匪浅。API的外观如下所示: def serialize(obj:BaseModel) -> Dict[str,Any]: """ Serialize the object to a dictionary. """ def deserialize(data:Dict[str,Any], clazz:type) ->
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. """
序列化方法很好,但反序列化类型暗示不是最佳方法。我想指出反序列化的返回值将是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类型的对象(实例)
我读了一些书,但还没有找到答案(用谷歌搜索这个问题也很棘手)。这里是否有明显的遗漏,或者Python3.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和类型检查器之间断开连接时,您可能会遇到一些麻烦:
T = TypeVar('T', bound=BaseModel)
def deserialize(etc, T:type) -> T:
然后,
T
既是参数名又是返回类型。我不知道你的IDE是否聪明到可以得到这个,或者愤怒到可以怨恨它 啊,这是一个非常有趣的想法。我会试试看。(尽管在我键入之后,我立即意识到我的目标之一是让我的类型检查器验证类属性和[class]方法,这似乎会因为这个提示而丢失。)我认为您可以这样做,但您可以通过指定其边界来做,这是T
规范的一部分。您仍然可以对该类进行运行时检查——这样该类就拥有了数据所需的所有字段,但这超出了静态类型检查器的范围。虽然pycharm目前似乎不支持Callable,但这似乎是解决此问题的最佳(唯一真实的?)解决方案。