当我运行 mypy 检查以下代码时:
from functools import cached_property
def func(s: str) -> None:
print(s)
class Foo:
@cached_property
def prop(self) -> int:
return 1
foo = Foo()
func(foo.prop)
我收到错误:
error: Argument 1 to "func" has incompatible type "int"; expected "str"
现在我想通过继承来扩展我的项目的 cached_property 行为:
from functools import cached_property
def func(s: str) -> None:
print(s)
class result_property(cached_property):
pass
class Foo:
@result_property
def prop(self) -> int:
return 1
foo = Foo()
func(foo.prop)
尚未向
result_property
添加任何额外行为。但是当我运行 mypy 检查它时,我得到:
Success: no issues found in 1 source file
我希望两种情况下类型检查的结果应该相同。为什么不一样?
mypy 无法将您的自定义 result_property 装饰器识别为与类型检查的 cached_property 具有相同的行为。您应该在 result_property 中显式定义 get 以保留类型信息。即:
from functools import cached_property
from typing import Any, Callable, TypeVar, Generic, Optional, Type
T = TypeVar("T")
F = Callable[..., T]
class result_property(cached_property, Generic[T]):
def __get__(self, instance: Optional[object], owner: Optional[Type[object]] = None) -> T:
return super().__get__(instance, owner)