如何在 Python 中创建通用接口?

2024-01-20

我想在 Python 中创建与此等效的内容:

static class Event {}

static class MyEvent extends Event {}

interface Filter<E extends Event> {
    boolean filter(E event);
}

static class MyFilter implements Filter<MyEvent> {
    @Override public boolean filter(MyEvent event) {
        return true;
    }
}

这是我的尝试:

from typing import TypeVar, Protocol

class Event:
    pass

class MyEvent(Event):
    pass

E = TypeVar("E", bound=Event)

class Filter(Protocol[E]):
    def filter(self, event: E) -> bool:
        raise NotImplementedError

class MyFilter(Filter):
    def filter(self, event: MyEvent) -> bool:       # should be ok
        raise NotImplementedError

class BadFilter(Filter):
    def filter(self, event: object) -> bool:        # should fail
        raise NotImplementedError

...失败了main.py:11: error: Invariant type variable 'E' used in protocol where contravariant one is expected。除非我误会了,否则 Java 似乎可以处理不变的情况,这也是我的想法;我不想要各种Filter彼此兼容。无论如何,打巴掌contravariant=True onto T . So,

为什么协议需要逆变变量?并且,如何进行 Python 代码类型检查?


协议不允许这样做,因为它破坏了子类型的传递性。看PEP 544 https://www.python.org/dev/peps/pep-0544/#overriding-inferred-variance-of-protocol-classes.

如果你有以下两个类:

class A:
    def method(self, arg: int):
        pass

class B(A):
    def method(self, arg: object):
        pass

then B是一个有效的子类A, 因为B.method可以接受任何参数A.method能。但是,如果您可以引入以下协议:

T = typing.TypeVar('T')

class Proto(typing.Protocol[T]):
    def method(self, arg: T):
        pass

then A会满足Proto[int], but B不会,由于不变性T.

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

如何在 Python 中创建通用接口? 的相关文章

  • Python Pandas 滚动聚合一列列表

    我有一个简单的数据框 df 和一列列表lists 我想根据以下内容生成一个附加列lists The df好像 import pandas as pd lists 1 1 2 1 2 3 3 2 9 7 9 4 2 7 3 5 create
  • 为什么 Mypy 在 __init__ 中分配已在类主体中进行类型提示的属性时不给出键入错误?

    这是我的示例 python 文件 class Person name str age int def init self name age self name name self age age p Person 5 5 但当我跑步时myp
  • 如何让“conda”安装程序查找“PyPi”包

    我试图使用conda http conda pydata org docs using pkgs html managing packages包管理器来安装我的 Python 包 最近 我遇到了 Anaconda org 存储库中不存在我需
  • 如何通过 python 中的函数运行列表?

    我试图通过我创建的函数运行我的列表 但不断收到错误 我不知道出了什么问题 温度 F temp f 19 21 21 21 23 功能 def fahrToCelsius tempFahrenheit return tempFahrenhei
  • 使用 Boto3 超时的 AWS Lambda 函数

    我已经解决了我自己的问题 但无论如何我都会发布它 希望能节省其他人几个小时 我在 AWS 上有一个无服务器项目 使用 Python 将记录插入到 kinesis 队列中 但是 当我使用 boto3 client kinesis 或 put
  • Python Requests 库重定向新 url

    我一直在浏览 Python 请求文档 但看不到我想要实现的任何功能 在我的脚本中我设置allow redirects True 我想知道该页面是否已重定向到其他内容 新的 URL 是什么 例如 如果起始 URL 为 www google c
  • 动态字段取决于 WTForms 的先前字段

    我正在使用 WTForms 制作表格 目前 我有这个 class UploadForm flask wtf Form fichier wtforms fields FileField u Fichier description wtform
  • 使用 Pandas 从 csv 文件读取标题信息

    我有一个包含 14 行标题的数据文件 在标头中 有经纬度坐标和时间的元数据 我目前正在使用 pandas read csv filename delimiter header 14 读取文件 但这只是获取数据 我似乎无法获取元数据 有人知道
  • Python speedtest.net,或等效的[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 是否有一个 Python 库可以实现 SpeedTest net 测试或等效的互联网连接速度测试 GitHub上有一个项目叫速度检查 https gi
  • 会话数据库表清理

    该表是否需要清除或者由 Django 自动处理 Django 不提供自动清除功能 然而 有一个方便的命令可以帮助您手动完成此操作 Django 文档 清除会话存储 https docs djangoproject com en dev to
  • 我可以用关闭的文件对象做什么?

    当您打开文件时 它存储在一个打开的文件对象中 该对象使您可以访问该文件的各种方法 例如读取或写入 gt gt gt f open file0 gt gt gt f
  • Pandas 字典键到列[重复]

    这个问题在这里已经有答案了 我有一个像这样的数据框 index column1 e1 u c680 5 u c681 1 u c682 2 u c57 e2 u c680 6 u c681 2 u c682 1 u c57 e3 u c68
  • 使用 python 脚本更改 shell 中的工作目录

    我想实现一个用户态命令 它将采用其参数之一 路径 并将目录更改为该目录 程序完成后 我希望 shell 位于该目录中 所以我想实施cd命令 但需要外部程序 可以在 python 脚本中完成还是我必须编写 bash 包装器 Example t
  • 在 django 中导入设置时出现奇怪的错误

    我有很多项目在 ubuntu 中使用 python2 7 和 virtualenv virtualenvwrapper 工作 在我的工作中 一些开发人员使用 macosx 和 windows 通常我像往常一样创建项目 django admi
  • Python在没有pandas的情况下解码excel表

    我正在尝试在 python 中读取 excel 文件而不使用pandas or xlrd 我一直在尝试将结果转换为bytes to utf 8没有任何成功 xls 文件中的数据 colA colB colC spc 1D0 20190705
  • 使用 ElementTree 在 python 中解析 xml

    我对 python 很陌生 我需要解析一些脏的 xml 文件 这些文件需要先清理 我有以下 python 代码 import arff import xml etree ElementTree import re totstring wit
  • Flymake的临时文件可以在系统临时目录下创建吗?

    我目前正在使用以下代码在 emacs 中连接 Flymake 和 Pyflakes defun flymake create temp in system tempdir filename prefix make temp file or
  • Eclipse/PyDev 中未使用导入警告,尽管已使用

    我正在我的文件中导入一个绘图包 如下所示 import matplotlib pyplot as plt 稍后我会在我的代码中成功使用此导入 fig plt figure figsize 16 10 然而 Eclipse 告诉我 未使用的导
  • 将 Django 中的所有视图限制为经过身份验证的用户

    我是 Django 新手 我正在开发一个项目 该项目有一个登录页面作为其索引和一个注册页面 其余页面都必须仅限于登录用户 如果未经身份验证的用户尝试访问这些页面 则必须将他 她重定向到登录页面 我看到 login required装饰器会将
  • PyObjC + Python 3.0 问题

    默认情况下 Cocoa Python 应用程序使用默认的 Python 运行时版本 2 5 如何配置我的 Xcode 项目以便它使用较新的 Python 3 0 运行时 我尝试用新版本替换项目中包含的Python framework 但它不

随机推荐

  • 在python中求小矩阵

    def getMatrixMinor m i j return row j row j 1 for row in m i m i 1 上面是我在堆栈溢出中找到的代码 以便找到矩阵的逆 但是 我对 python 确实很陌生 任何人都可以解释背
  • iphone sdk中Delegate的使用

    有人可以解释一下委托在 iphone sdk 中到底是如何工作的吗 一个简单的示例如何使用委托以及使用委托的优点是什么 委托模式 http en wikipedia org wiki Delegation pattern在iPhone SD
  • 如何在 python 中与终端交互

    我正在写一个小脚本 该脚本应打开 3 个终端并独立与这些终端交互 我很清楚子流程是做到这一点的最佳方法 到目前为止我所做的 usr bin env python import subprocess term1 subprocess Pope
  • ios7 UINavigationBar 一段时间后停止在状态栏下延伸

    首先 这不是关于导航栏重叠状态栏的问题 与许多其他问题一样 UINavigationBar 我的导航控制器 完全按照我的要求对齐 问题出在我的导航栏自定义背景上 背景图像 或导航栏本身 在状态栏下随机停止扩展 在我的应用程序启动几秒钟后或当
  • 给定 N 个弹珠和 M 个楼层,找到算法来找到弹珠会破裂的最低楼层

    它与这个问题相关 两颗弹珠和一座 100 层的建筑 https stackoverflow com questions 6547 two marbles但它不一样 我们要找出最好的算法来找出最小化找到最低楼层所需的最大下降的策略 这就是我的
  • Angular 2 路由器,错误:无法激活已激活的插座

    我想我根本无法理解 Angular 2 路由 我的应用程序中有这样的结构 const routes Routes path login component LoginViewComponent path main component Mai
  • PyTorch 在 TensorDataset 上进行转换

    我在用着TensorDataset https pytorch org docs stable data html highlight tensordataset从 numpy 数组创建数据集 convert numpy arrays to
  • izpack-maven-plugin 默认情况下不包含本机库

    我已在安装 XML 文件中指定了标准快捷方式生成本机
  • 我应该如何修改我的 Queue 类以允许用户在 F# 中创建未指定类型的空队列?

    我创建了一个不可变的Queue在F 中如下 type Queue lt a gt f a list r a list let check function r gt Queue List rev r f r gt Queue f r mem
  • 如何正确绘制变量

    我尝试查看文档 但没有找到我需要的答案 所以我在这里问 例如 我有 15 只海龟 这个数字可能会有所不同 我需要将它们的变量 例如收入 绘制到一个图中 我知道我可以通过命令绘制 1 个代理的变量 plot revenue of turtle
  • 用 for 循环替换 if 语句 (Java)

    我正在开发一个项目 收到的评论之一是我的 if 语句太长 我同意这一点 但我仍然很困惑如何用建议的 for 循环替换它 它一直让我发疯 该项目是分析句子中的辅音并报告它们是否在其中 这是我使用的代码 该项目已经被标记 所以这更像是一个 我的
  • 序列化类时出现 Stackoverflow 异常

    我有一棵树 想将它们序列化为 xml 这些节点派生自 Nodebase 类 我认为是在此处找到的 该类在序列化时失败 public class NodeBase IEqualityComparer IEnumerable IEnumerab
  • Python/AWS Lambda 函数:如何查看 /tmp 存储?

    Lambda 函数可以访问自己的磁盘空间 tmp目录 我的问题是 我在哪里可以直观地看到 tmp目录 我正在尝试将文件下载到 tmp目录来读取它们 并向其中写入一个新文件 我实际上希望看到我正在处理的文件是否正确存储在 tmp执行期间 谢谢
  • 目前 WPF 最好的空闲时间选择器是什么?

    我正在寻找一个简单的时间选择器WPF 的控件 我找到了这个 http marlongrech wordpress com 2007 11 18 time picker http marlongrech wordpress com 2007
  • Laravel 社交名流的名字和姓氏

    我正在使用 Laravel 的 Socialite 将社交身份验证添加到应用程序中 我可以检索全名 但不能分别检索名字和姓氏 回调发生且社交名流处理后 用户已成功检索 如果我要转储我从中恢复的用户 user this gt social g
  • 为arm64构建OpenSSL FIPS

    我找到了为arm64构建非FIPS openssl的参考 但我需要构建FIPS版本 项目如https github com GotoHack iOS openSSL FIPS https github com GotoHack iOS op
  • 运算符不存在:json = json

    当我尝试从表中选择一些记录时 SELECT FROM movie test WHERE tags dramatic women political json sql代码抛出错误 LINE 1 SELECT FROM movie test W
  • 通过注释抑制 IntelliJ IDEA 中的重复警告

    从版本 15 开始 IntelliJ 警告我有关代码重复的问题 https www jetbrains com help idea 2016 1 analyzing duplicates html origin old help 在某些情况
  • 如何在android中点击按钮打开下面的自定义布局对话框?

    我想在点击按钮下方创建下拉自定义对话框 单击计数器按钮 布局将显示在按钮下方 我看到了很多链接 但他们只打开列表 操作栏下拉打开和关闭项目样式 https stackoverflow com questions 15824793 actio
  • 如何在 Python 中创建通用接口?

    我想在 Python 中创建与此等效的内容 static class Event static class MyEvent extends Event interface Filter