通用代码的类型提示
Type hints for generic code
比方说,我有这段代码:
class BaseModel(object):
pass
class AppleModel(BaseModel):
pass
class OrangeModel(BaseModel):
pass
def get_record(model, pk):
try:
result = model.objects.get(pk=pk)
# Some code working with BaseModel..
return result
except model.DoesNotExist:
return None
现在,我想像本例中那样使用它并带有适当的类型注释...
myApple = get_record(AppleModel, 12)
myApple. # type hints for AppleModel
myOrange = get_record(OrangeModel, 433)
myOrange. # type hints for OrangeModel
我应该如何注释get_record
函数?我试过类似
def get_record(model: Type[BaseModel], id: int) -> Optional[BaseModel]:
# ...
但是,我丢失了有关子类的信息。我尝试使用 Generic,但没有成功。
我假设你想要做的是 get_record
接受 BaseModel
的某些子 class 的类型,以及 return 相应的实例class.
在这种情况下,您可能需要使用 TypeVars -- in particular, TypeVars with an upper bound restriction。
大致如下所示:
from typing import Type, Optional, TypeVar
# ...snip...
T = TypeVar('T', bound=BaseModel)
def get_record(model: Type[T], id: int) -> Optional[T]:
# ...
比方说,我有这段代码:
class BaseModel(object):
pass
class AppleModel(BaseModel):
pass
class OrangeModel(BaseModel):
pass
def get_record(model, pk):
try:
result = model.objects.get(pk=pk)
# Some code working with BaseModel..
return result
except model.DoesNotExist:
return None
现在,我想像本例中那样使用它并带有适当的类型注释...
myApple = get_record(AppleModel, 12)
myApple. # type hints for AppleModel
myOrange = get_record(OrangeModel, 433)
myOrange. # type hints for OrangeModel
我应该如何注释get_record
函数?我试过类似
def get_record(model: Type[BaseModel], id: int) -> Optional[BaseModel]:
# ...
但是,我丢失了有关子类的信息。我尝试使用 Generic,但没有成功。
我假设你想要做的是 get_record
接受 BaseModel
的某些子 class 的类型,以及 return 相应的实例class.
在这种情况下,您可能需要使用 TypeVars -- in particular, TypeVars with an upper bound restriction。
大致如下所示:
from typing import Type, Optional, TypeVar
# ...snip...
T = TypeVar('T', bound=BaseModel)
def get_record(model: Type[T], id: int) -> Optional[T]:
# ...