mypy 用于cached_property的派生类

问题描述 投票:0回答:1

当我运行 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
我希望两种情况下类型检查的结果应该相同。为什么不一样?

python properties decorator python-decorators mypy
1个回答
0
投票

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)
© www.soinside.com 2019 - 2024. All rights reserved.