下面是一个例子:
class Service:
def __init__(self):
self.data = dict()
def get(self, clazz):
# clazz is a class Type, and always return an instance of clazz
return self.data[clazz]
def register(self, clazz, *args, **kwargs):
self.data[clazz] = clazz(*args, **kwargs)
class A:
def method_of_a(self):
pass
class B:
pass
service = Service()
service.register(A)
service.register(B)
现在我完成了服务代码,并像一样继续编码
x = service.get(A)
x.method_of_a()
代码是有效的,但有一个问题,当我编码时,当你输入时,IDE(本例中为pycharm(将不会显示x的函数
x.
即使我这样修改我的代码,它也不起作用
def get(self, clazz):
result: clazz = self.data[clazz]
return result
我想知道是否有任何方法可以实现Service,即IDE可以识别返回值的类型?
使用typing.TypeVar
和typing.Type
键入hint您的.get()
函数,表示";如果用T的类型调用,则返回T":
from typing import TypeVar, Type
T = TypeVar('T')
class Service:
def __init__(self):
self.data = dict()
def get(self, clazz: Type[T]) -> T:
return self.data[clazz]
def register(self, clazz, *args, **kwargs):
self.data[clazz] = clazz(*args, **kwargs)
class A:
def method_of_a(self):
pass
s = Service()
s.register(A)
x = s.get(A)
x.method_of_a()
reveal_type(x)
当使用mypy
运行时,reveal_type()
调用打印出
so73566368.py:24: note: Revealed type is "so73566368.A"