Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用类型提示/泛型来描述类型类(“type”)的参数的正确方法_Python_Python 3.x_Generics_Typing - Fatal编程技术网

Python 使用类型提示/泛型来描述类型类(“type”)的参数的正确方法

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) ->

这似乎类似于,但是,那里被接受的答案实际上并没有回答我的问题,因此,可能问题表达不正确(?)

我有一个序列化/反序列化框架,它将从[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. """
序列化方法很好,但反序列化类型暗示不是最佳方法。我想指出反序列化的返回值将是
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,但这似乎是解决此问题的最佳(唯一真实的?)解决方案。