首页 > 编程问答 >使用描述符进行类型提示

使用描述符进行类型提示

时间:2024-07-22 10:44:19浏览次数:7  
标签:python mypy python-descriptors

这个拉取请求中 看起来添加了对描述符的类型提示支持。

但是,似乎没有发布最终的“正确”用法示例,也没有添加任何文档 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 中描述符的推荐方式。

分解代码

  1. TypeVar : T V 是类型变量。它们充当可用于表示任何类型的占位符,从而使类型提示更灵活。
  2. classproperty 描述符 :
  3. __init__ 将 getter 函数(如 forty_two )作为参数,并期望它接受一个类型为 Type[T] 的参数并返回 V 类型的值。
  4. __get__ 方法是描述符协议的一部分。当像访问属性一样访问描述符时,就会调用它。它接受两个参数:
    • instance : 类实例(如果在实例上访问)或 None (如果在类上访问)。
    • owner : 拥有描述符的类。
  5. 在本例中, __get__ 返回通过调用 getter 函数并传入 owner (类本身)获得的值。

  6. forty_two 函数 : 这个函数被设计为与 classproperty 描述符一起使用。它接受一个类型为 Type 的参数(表示一个类),并返回一个整数(在本例中为 42)。

  7. 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

相关文章

  • Python学习计划——2.4列表推导式(List Comprehensions)
    列表推导式是Python的一种简洁且强大的语法,用于生成新的列表。它可以用更少的代码、更清晰的方式来创建列表,特别是在处理简单的循环和条件操作时。1.基本语法列表推导式的基本语法如下:[expressionforiteminiterable]expression:表达式,计算结果用于生成列表的元素。ite......
  • Python学习计划——2.3常用内置函数(len, max, min, sum, etc.)
    Python提供了许多内置函数,用于简化对数据结构的操作。以下是一些常用的内置函数及其详细说明。1.len()len()函数用于返回对象(如列表、元组、字符串、字典等)的长度(元素个数)。示例:#列表fruits=["apple","banana","cherry"]print(len(fruits))#输出:3#元组c......
  • 哪个 Python 框架可以在 Google Collab 中显示和更改图像?
    我希望能够在使用GoogleCollab时为RL绘制高fps的位图。我现在可以使用OpenCV绘制图像cv2_imshowgoogle替换cv2.imshow但是,它无法替换现有图像,它下面绘制了新的我能够在替换imshow函数中使用一些JavaScript来修复它。但刷新率约为......
  • VSCode 自动建议 python 导入而不依赖 Intellisense
    我正在使用Transformer中的AutoModel之类的对象,并且经常遇到自动导入建议无法找到的对象。我总是希望VSCode建议“从Transformer中执行”,而不是费心寻找它找不到的原因每当看到未定义的“AutoModel”时,都会导入AutoModel”,因此无需扫描任何python导入目录。这......
  • 如何使用Python计算位移自相关函数?
    我正在使用python来分析粒子的异常扩散。我已经得到了粒子轨迹的位移,我想计算并绘制位移自相关与滞后时间t的关系。我认为可能存在使用t和位移(如deltar)的自相关函数的一般函数,但我不能没找到。我可以得到函数或代码吗?可以使用numpy和matplotlib库在Python......
  • 一天一点点,第四天Python基础
    第一天:一天一点点。Python基础-CSDN博客第二天:一天一点点,接上章Python基础-CSDN博客第三天:一天一点点,第三天Python基础(循环语句)-CSDN博客推导式推导式是一种独特的数据处理方式,可以从一个数据序列构建另一个新的数据序列的结构体。推导式是一种强大且简洁的语法,适用于生......
  • Python - for循环不使用正则表达式附加数组
    以下代码从URL获取版本号,然后对于每个版本号,转到该版本号的页面并使用文件名的特定模式填充数组。生成的数组应包含每个版本号的文件名列表,但它似乎只包含早期版本(2.6)。使用print语句,我可以看到代码的工作原理是它获取sha256sums.asc文件-所有这些文件,所有版本。我猜......
  • 使用 callable_iterator (re.finditer) 导致 Python 冻结
    我有一个为文本的每一行调用的函数。deftokenize_line(line:str,cmd=''):matches=re.finditer(Patterns.SUPPORTED_TOKENS,line)tokens_found,not_found,start_idx=[],[],0print(matches)formatchinmatches:pass#Rest......
  • Python 的 time.sleep - 永远不会醒来
    我认为这将是那些简单的问题之一,但它让我感到困惑。[停止媒体:我是对的。找到了解决方案。查看答案。]我正在使用Python的单元测试框架来测试多线程应用程序。很好而且很直接-我有5个左右的工作线程监视一个公共队列,以及一个为它们制作工作项的生产者线程......
  • python中使用mitmproxy的http模块出错
    我有一个使用mitmproxyhttp函数的代码,它在这里惨败:defmain(stdscr):try:parser=argparse.ArgumentParser(description='NetSourNetworkAnalyzer')parser.add_argument('--proxy',action='store_true',help='EnableH......