输入通用代码的提示

时间:2018-01-16 18:23:37

标签: python django python-3.x django-models type-hinting

我们说,我有这段代码:

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,但没有成功。

1 个答案:

答案 0 :(得分:1)

我假设您要做的是让get_record接受BaseModel的某个子类的类型,并返回相应类的实例。

在这种情况下,您可能希望使用TypeVars - 尤其是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]:
    # ...