在 这个拉取请求中 看起来添加了对描述符的类型提示支持。
但是,似乎没有发布最终的“正确”用法示例,也没有添加任何文档
typing
模块
或
Mypy
.
它 看起来像 正确的用法是这样的 这个 :
from typing import TypeVar
T = TypeVar('T')
V = TypeVar('V')
class classproperty():
def __init__(self, getter: Callable[[Type[T]], V]) -> None:
self.getter = getter
def __get__(self, instance: Optional[T], owner: Type[T]) -> V:
return self.getter(owner)
def forty_two(cls: Type) -> int:
return 42
class C:
forty_two: int = classproperty(forty_two)
这似乎是合乎逻辑的,但我不知道这是否真的是正确的做法。
有这方面的任何文档吗?或者实际适用于合并版本的完整示例?
你展示的使用描述符进行类型提示的方法是正确的。虽然没有很多官方文档,但我们可以分解一下,并查看为什么这是 Mypy 中描述符的推荐方式。
分解代码
-
TypeVar
:
T
和V
是类型变量。它们充当可用于表示任何类型的占位符,从而使类型提示更灵活。 - classproperty 描述符 :
-
__init__
将 getter 函数(如forty_two
)作为参数,并期望它接受一个类型为Type[T]
的参数并返回V
类型的值。 -
__get__
方法是描述符协议的一部分。当像访问属性一样访问描述符时,就会调用它。它接受两个参数:-
instance
: 类实例(如果在实例上访问)或None
(如果在类上访问)。 -
owner
: 拥有描述符的类。
-
-
在本例中,
__get__
返回通过调用 getter 函数并传入owner
(类本身)获得的值。 -
forty_two 函数 : 这个函数被设计为与
classproperty
描述符一起使用。它接受一个类型为Type
的参数(表示一个类),并返回一个整数(在本例中为 42)。 -
C 类 :
forty_two
属性被注解为int
类型,并使用classproperty
描述符进行装饰。这意味着当在C
类上访问forty_two
时,将调用classproperty.__get__
方法,进而调用forty_two
函数并返回42
。
为什么这样做?
-
清晰的类型信息
:
classproperty
描述符的类型提示明确说明了 getter 函数的预期输入和输出类型,以及描述符本身的行为方式。 -
静态类型检查
: Mypy 可以使用这些类型提示来验证你是否在正确地使用
classproperty
描述符,并及早发现潜在的类型错误。 - 可读性和可维护性 : 明确的类型提示使代码更易于理解和维护,尤其是在处理复杂代码库时。
其他资源
- 尽管文档有限,但你可以参考 Mypy 存储库中的拉取请求和问题以获得更多信息: https://github.com/python/mypy/pull/2266
- 在实际项目中观察类型提示的使用也可能有所帮助。
请记住,尽管类型提示在 Python 中非常强大,但它们主要是为了辅助开发人员。在编写类型提示时,优先考虑清晰性和准确性。
标签:python,mypy,python-descriptors From: 54413434