如何让python类型检查器知道它应该返回其类的新实例?

时间:2017-07-17 06:26:43

标签: python annotations subclass typechecking

我想使用classmethod来返回当前类的新实例,我尝试了一些类似下面的代码,但它引发了一个NameError('name'T'未定义')

将代码T = TypeVar('T', bound=A)放在上面的class A上也不起作用。

处理它有什么好主意吗?

import json
from typing import TypeVar


class A(dict):

    def __init__(self, name):
        super(dict, self).__init__()
        self["name"] = name


    @classmethod
    def foo(cls: T, args: str)->T:
        return json.loads(args)
T = TypeVar('T', bound=A)


class B(A):
    pass

b = B(name='B')
# True
print(isinstance(b.foo(json.dumps(b)),B))

1 个答案:

答案 0 :(得分:2)

使用字符串对A进行前瞻性引用,并为cls提供Type[T]的正确类型:

import json
from typing import Type, TypeVar


T = TypeVar('T', bound='A')


class A(dict):
    def __init__(self, name: str) -> None:
        super().__init__(name=name)

    @classmethod
    def foo(cls: Type[T], args: str) -> T:
        return cls(**json.loads(args))


class B(A):
    def is_b(self) -> bool:
        return True


b = B.foo('{"name": "foo"}')
print(b.is_b())