自定义鸭子类型的 Python 类型注释

2023-12-26

蟒蛇的typing模块定义了许多鸭子类型,例如,typing.SupportsAbs表示任何实现了__abs__特殊方法。

是否可以以某种方式定义自定义鸭子类型,以便我可以将它们用作有效的类型注释?

例如,我希望能够注释一个参数应该是一个鸭子类型的等价物threading.Lock,即任何实现acquire and release方法。理想情况下,我可以将这样的论点注释为SupportsAcquireAndRequire or DuckLock, 而不是object.


您可以定义一个抽象基类 (ABC) https://docs.python.org/3/library/abc.html指定接口:

from abc import ABCMeta, abstractmethod

class SupportsAcquireAndRequire(metaclass=ABCMeta):
    @abstractmethod
    def acquire(self):
        pass

    @abstractmethod
    def release(self):
        pass

    @classmethod
    def __subclasshook__(cls, C):
        for method in ('release', 'acquire'):
            for B in C.__mro__:
                if method in B.__dict__:
                    if B.__dict__[method] is None:
                        return NotImplemented
                    break
            else:
                return NotImplemented
        return True

这基本上就是协议的方式(比如typing.SupportsAbs)已实现,尽管没有直接使用ABCMeta.

通过给 ABC__subclasshook__ method https://docs.python.org/3/library/abc.html#abc.ABCMeta.__subclasshook__,你可以使用它isinstance() and issubclass()测试,这对于像这样的工具来说已经足够好了mypy http://mypy.readthedocs.io/en/latest/class_basics.html?highlight=abc#abstract-base-classes-and-multiple-inheritance:

>>> from threading import Lock
>>> isinstance(Lock(), SupportsAcquireAndRequire)
True
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自定义鸭子类型的 Python 类型注释 的相关文章

  • Python 切片对象和 __getitem__

    python 中是否有内部的东西来处理传递给的参数 getitem 不同 并自动转换start stop step构造成切片 这是我的意思的演示 class ExampleClass object def getitem self args
  • 如何使用 Python 3 绕过 HTTP Error 403: Forbidden with urllib.request

    您好 不是每次都这样 但有时在尝试访问 LSE 代码时 我会收到每一个烦人的 HTTP 错误 403 禁止消息 任何人都知道我如何仅使用标准 python 模块来克服这个问题 遗憾的是没有漂亮的汤 import urllib request
  • 将 numpy 数组合并为单个 int

    numpy 数组怎么可以这样 10 22 37 45 转换为单个 int32 数字 如下所示 10223745 这可以工作 gt gt gt int join map str 10 22 37 45 10223745 基本上你使用map s
  • 使用 Django 将文件异步上传到 Amazon S3

    我使用此文件存储引擎在上传文件时将文件存储到 Amazon S3 http code welldev org django storages wiki Home http code welldev org django storages w
  • 如何通过 python 多处理利用所有核心

    我一直在摆弄Python的multiprocessing现在已经使用了一个多小时的功能 尝试使用并行化相当复杂的图形遍历函数multiprocessing Process and multiprocessing Manager import
  • 如何过滤 Pandas GroupBy 对象并获取 GroupBy 对象?

    当对 Pandas groupby 操作的结果执行过滤时 它返回一个数据帧 但假设我想执行进一步的分组计算 我必须再次调用 groupby 这似乎有点绕 有更惯用的方法吗 EDIT 为了说明我在说什么 我们无耻地从 Pandas 文档中窃取
  • 使用 Paramiko 进行 DSA 密钥转发?

    我正在使用 Paramiko 在远程服务器上执行 bash 脚本 在其中一些脚本中 存在与其他服务器的 ssh 连接 如果我只使用 bash 不使用 Python 我的 DSA 密钥将被第一个远程服务器上的 bash 脚本转发并使用 以连接
  • 尝试在 Anaconda 上安装 pygame 时,Python 3.x 降级为 Python 2.7

    我正在使用 Anaconda Python 3 我正在尝试安装 pyOpenGL Vpython 和 pygame 安装 pyOpenGL 和 Vpython 就可以使用conda install 当我尝试安装 Pygame 时 使用con
  • python 中的 <> 运算符有什么作用?

    我刚刚遇到这个here http www feedparser org feedparser py 总是这样使用 if string1 find string2 lt gt 1 pass 什么是 lt gt 运算符这样做 为什么不使用通常的
  • Python代码没有抛出错误,但所需的输出不一样

    无法接收 python 代码的输出 我尝试通过打印每一行来调试代码 def get sum metrics predictions metrics for i in range 0 3 metrics append lambda x x i
  • 根据其他单元格值更改多个单元格值

    我想更改包含的单元格moving to movingToOpenor movingToClose基于下一个单元格中给出的状态 有时循环会被中断并且不会从open to close or close to open 这是我当前的数据框 Dat
  • 使用 for 循环创建一系列元组

    我已经搜索过 但找不到答案 尽管我确信它已经存在了 我对 python 很陌生 但我以前用其他语言做过这种事情 我正在以行形式读取数据文件 我想将每行数据存储在它自己的元组中 以便在 for 循环之外访问 tup i inLine wher
  • python中basestring和types.StringType之间的区别?

    有什么区别 isinstance foo types StringType and isinstance foo basestring 对于Python2 basestring是两者的基类str and unicode while type
  • 从 Flask 运行 NPM 构建

    我有一个 React 前端 我想在与我的 python 后端 API 相同的源上提供服务 我正在尝试使用 Flask 来实现此目的 但我遇到了 Flask 找不到我的静态文件的问题 我的前端构建是用生成的npm run build in s
  • Airflow 1.9 - 无法将日志写入 s3

    我在 aws 的 kubernetes 中运行气流 1 9 我希望将日志发送到 s3 因为气流容器本身的寿命并不长 我已经阅读了描述该过程的各种线程和文档 但我仍然无法让它工作 首先是一个测试 向我证明 s3 配置和权限是有效的 这是在我们
  • 使用 Python 将连续日期分组在一起

    Given dates datetime 2014 10 11 datetime 2014 10 1 datetime 2014 10 2 datetime 2014 10 3 datetime 2014 10 5 datetime 201
  • 无法通过 Python 子进程进行 SSH

    我需要通过堡垒 ssh 进入机器 因此 该命令相当长 ssh i
  • Django 管理器链接

    我想知道是否有可能 如果可以的话 如何 将多个管理器链接在一起以生成受两个单独管理器影响的查询集 我将解释我正在研究的具体示例 我有多个抽象模型类 用于为其他模型提供小型的特定功能 其中两个模型是DeleteMixin 和GlobalMix
  • 将 Keras 集成到 SKLearn 管道?

    我有一个 sklearn 管道 对异构数据类型 布尔 分类 数字 文本 执行特征工程 并想尝试使用神经网络作为我的学习算法来拟合模型 我遇到了输入数据形状的一些问题 我想知道我想做的事情是否可能 或者我是否应该尝试不同的方法 我尝试了几种不
  • IndexError - 具有匀称形状的笛卡尔 PolygonPatch

    我曾经使用 shapely 制作一个圆圈并将其绘制在之前填充的图上 这曾经工作得很好 最近 我收到索引错误 我将代码分解为最简单的操作 但它甚至无法执行最简单的循环 import descartes import shapely geome

随机推荐

  • 如何在 angular-cli 项目中使用全局 scss 文件

    我是 Angular 4 和 Angular CLI 的新手 我找不到任何解决方案如何在整个应用程序中使用 root scss css 文件 因此 我的问题是 如何在项目中使用全局scss文件 创建一个styles文件夹中的src文件夹 然
  • 移动设备的 X/Y 触摸坐标

    我正在创建一个网络应用程序 我希望它可以在移动设备上使用 该应用程序的初始机制需要鼠标当前的 X Y 坐标 这不需要单击和拖动 只需在浏览器窗口周围移动鼠标即可 现在我一直在研究有关触摸和手势的各种 jQuery Javascript 库
  • Apache Pig:本地模式下使用简单 GROUP BY 时出现 OutOfMemory 异常

    当我尝试在一个微小的 3KB 随机生成的示例数据集上执行一个非常简单的 GROUP BY 时 我收到了 Pig 的 OutOfMemory 异常 小猪脚本 cat example pig raw LOAD example data USIN
  • Glassfish - 来自同一客户端的同时连接

    我正在构建一个必须处理来自一个客户端的最多 300 个请求的应用程序 我已尝试此链接上建议的所有配置 Glassfish 线程池 接受器线程 HTTP 最大连接数 https stackoverflow com questions 3309
  • 使用 JMeter 发送带有二进制正文的 HTTP 请求

    我正在尝试使用 JMeter 发送带有二进制内容的 HTTP 请求 在文档中 我发现我可以发送带有二进制内容的文件 我认为这对于我的需求来说不是一个好的解决方案 因为每个请求都有自己的二进制内容 下面是我用 Perl 编写的客户端示例 演示
  • 如何制作一个简单的密码页面[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 小心 英语不好 我正在尝试创建一个页面 其中只有一个 小块 您可以在其中键入我设置的密码 如果您输入正确的密码并按 输入站点 按钮 您
  • GITLAB CI 管道未触发

    我已经为 GitLab CI CD 编写了这个 yml 文件 有一个已配置并正在运行的共享运行器 我是第一次这样做 不确定我哪里出错了 我正在进行的 Angular JS 项目 存储库上有一个 gulp 构建文件 并且在本地计算机上完美运行
  • 正则表达式 - 替换除 URL/URI 内的单词

    为 Web 应用程序编写全球化模块 我需要一个正则表达式来用另一个单词 翻译 替换一个单词的所有实例 除了在 URL URI 中找到的单词 编辑 我忘了提及我正在使用 Ruby 所以我不能使用 Lookbehind 根据 URI 正则表达式
  • 当前上下文中不存在错误但编译正常

    我遇到了一个我认为有点奇怪的问题 我收到两个 当前上下文中不存在 错误 Error 1 The name employeeDetails does not exist in the current context c users kelly
  • Qt/QML:将 QImage 从 C++ 发送到 QML 并在 GUI 上显示 QImage

    我创建了一个类Publisher它周期性地发出QImage目的 然而我很难画出QImage到 QML 元素 看来Image and CanvasQML 组件需要QUrl代替QImage 但我不知道如何转换我的QImage to a QUrl
  • 使用 ffmpeg 和 xfade 过滤器合并多个视频文件[关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 我需要将多个视频文件 包含音频 合并到一个视频中 我注意到 xfade 最近发布并使用了它 但我遇到了音频同步问题 所有视频的视频和音
  • UWP/WinRT:如何保存然后恢复简单的文本框以从终止状态恢复?

    In 这个文件 https msdn microsoft com en us library windows apps xaml mt243287 aspx在描述 Windows 10 UWP 应用程序的生命周期时 它指出 用户现在希望您的
  • 为什么 Jupyter 寻找我尚未安装的扩展?

    即使在完全原始的虚拟环境中 我也会收到以下形式的错误 Package jupyter server terminals took 0 0020s to import W 2023 09 14 09 17 01 917 ServerApp N
  • 使用 php SOAP 和 WSDL 的正确步骤是什么?

    我已经解决了许多问题和困惑 请参阅 关于此问题的最终代码和问题 https stackoverflow com questions 27147950 soap issue server was unable to process reque
  • Bootstrap 3 带有输入组的验证状态

    如何将 Bootstrap 3 验证状态添加到输入组 该状态似乎仅适用于组的输入部分 编辑 10 02 2014 为了澄清 我使用带有按钮的输入组 div class form group has success col md 3 div
  • C++ 错误 - C4819、C2761、C2447

    我正在使用 Visual Studio 2017 来了解 SFML 和精灵动画 但我无法运行此代码 我用编码 Unicode 带有签名的UTF 8 代码页65001 保存它 include
  • C中的字符数组消隐

    code int main int n m i j char a 10 10 printf enter n and m values n scanf d d n m printf enter array values for i 0 i
  • Webpack UMD:关键依赖项...无法静态提取

    我正在尝试使用 webpack 构建一个 umd 库 无论我做什么都会收到警告 D Code Node sample io source index ts 中的警告 3 24 关键依赖 require函数的使用方式无法静态提取依赖 当我尝试
  • 访问远程服务器时MySQL连接出错

    I ve 托管 MySQL 数据库 in a 网络服务器 I ve 授予所有权限并允许我的IP远程连接到这个数据库从我的本地计算机 它已连接 我可以将数据从数据库检索到我的 Java Swing 应用程序 但是有时我收到此错误消息 and
  • 自定义鸭子类型的 Python 类型注释

    蟒蛇的typing模块定义了许多鸭子类型 例如 typing SupportsAbs表示任何实现了 abs 特殊方法 是否可以以某种方式定义自定义鸭子类型 以便我可以将它们用作有效的类型注释 例如 我希望能够注释一个参数应该是一个鸭子类型的