自定义类型.NamedTuple

2024-04-14

我在用着NamedTuples来保存数据,我想添加一个可以被多个继承的方法NamedTuple基础课程。但是当我尝试使用多重继承或子类化时NamedTuple基于类,它不起作用。具体来说,我试图自动为所有数据类提供一个方法,该方法可以查看类注释,然后基于该方法调用一些序列化代码。以下是我尝试过的一些示例:

from typing import NamedTuple


class Base1:
    def foo(self):
        print(self.__annotations__)


class Test1(NamedTuple, Base1):
    x: int
    y: int


x = Test1(1, 2)
x.foo() # raises AttributeError


class Base2(NamedTuple):
    def foo(self):
        print(self.__annotations__)


class Test2(Base2):
    x: int
    y: int


x = Test2(1, 2) # TypeError: __new__() takes 1 positional argument but 3 were given

有没有办法让我使用NamedTuple这样的课?


有问题的是使用的元类typing.NamedTuple;这个元类ignores所有基类并且只生成一个collections.namedtuple()添加注释信息的类(复制直接在类上定义的任何其他属性)。

您可以定义自己的元类(它必须是typing.NamedTupleMeta),这会添加您的附加基类after生成命名元组类:

import typing

NamedTuple = typing.NamedTuple
if hasattr(typing.NamedTuple, '__mro_entries__'):
    # Python 3.9 fixed and broke multiple inheritance in a different way
    # see https://github.com/python/cpython/issues/88089
    NamedTuple = typing._NamedTuple

class MultipleInheritanceNamedTupleMeta(typing.NamedTupleMeta):
    def __new__(mcls, typename, bases, ns):
        if NamedTuple in bases:
            base = super().__new__(mcls, '_base_' + typename, bases, ns)
            bases = (base, *(b for b in bases if not isinstance(b, NamedTuple)))
        return super(typing.NamedTupleMeta, mcls).__new__(mcls, typename, bases, ns)

class Base1(metaclass=MultipleInheritanceNamedTupleMeta):
    def foo(self):
        print(self.__annotations__)

class Test1(NamedTuple, Base1):
    x: int
    y: int

请注意,这不会让您继承字段!那是因为你must生成一个新的namedtuple任意字段组合的类。上述产生以下结构:

  • Test1, inherits from
    • _base_Test1 - the actual typing.NamedTuple generated namedtuple
      • tuple
    • Base1

这按要求工作:

>>> x = Test1(1, 2)
>>> x.foo()
{'x': <class 'int'>, 'y': <class 'int'>}

从技术上讲,您只需要在 Python 3.10 之前的 Python 版本中使用上述内容。 Python 3.9 进行了重构NamedTuple修复了这个问题背后的特定元类问题的实现,但随后引入了一个不同的通过明确提出问题TypeError声明不支持多重继承。这TypeError was 作为错误提出 https://github.com/python/cpython/issues/88089,因为存在使用多重继承的有效用例NamedTuple,并且该异常在 Python 3.11 中被删除。

不过,您可以在 Python 3.11 中安全地使用此答案中的代码。

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

自定义类型.NamedTuple 的相关文章

  • 如何用 python 和 sympy 解决多元不等式?

    我对使用 python 和 Sympy 还很陌生 并且遇到了使用 sympy 解决多元不等式的问题 假设我的文件中有很多函数 如下所示 cst sqrt x 2 cst exp sqrt cst x 1 4 log log sqrt cst
  • Dask DataFrame 的逐行处理

    我需要处理一个大文件并更改一些值 我想做这样的事情 for index row in dataFrame iterrows foo doSomeStuffWith row lol doOtherStuffWith row dataFrame
  • 获取单个方程的脚本

    在文本文件中输入 a 2 8 b 3 9 c 4 8 d 5 9 e a b f c d g 0 6 h 1 7 i e g j f h output i j 期望的输出 输出 2 8 3 9 0 6 4 8 5 9 1 7 如果输入文件名
  • 类属性在功能上依赖于其他类属性

    我正在尝试使用静态类属性来定义另一个静态类属性 我认为可以通过以下代码来实现 f lambda s s 1 class A foo foo bar f A foo 然而 这导致NameError name A is not defined
  • NLTK、搭配问题:需要解包的值太多(预期为 2)

    我尝试使用 NLTK 检索搭配 但出现错误 我使用内置的古腾堡语料库 I wrote alice nltk corpus gutenberg fileids 7 al nltk corpus gutenberg words alice al
  • Python 中 genfromtxt() 的可变列数?

    我有一个 txt具有不同长度的行的文件 每一行都是代表一条轨迹的一系列点 由于每条轨迹都有自己的长度 因此各行的长度都不同 也就是说 列数从一行到另一行不同 据我所知 genfromtxt Python 中的模块要求列数相同 gt gt g
  • 使用正则表达式解析 Snort 警报文件

    我正在尝试使用 Python 中的正则表达式从 snort 警报文件中解析出源 目标 IP 和端口 和时间戳 示例如下 03 09 14 10 43 323717 1 2008015 9 ET MALWARE User Agent Win9
  • 无法包含外部 pandas 文档 Pycharm v--2018.1.2

    我无法包含外部 pandas 文档Pycharm v 2018 1 2 例如 numpy gt http docs scipy org doc numpy reference generated module name element na
  • python ttk treeview:如何选择并设置焦点在一行上?

    我有一个 ttk Treeview 小部件 其中包含一些数据行 如何设置焦点并选择 突出显示 指定项目 tree focus set 什么也没做 tree selection set 0 抱怨 尽管小部件明显填充了超过零个项目 但未找到项目
  • 将 subprocess.Popen 的输出通过管道传输到文件

    我需要启动一些长时间运行的进程subprocess Popen 并希望拥有stdout and stderr从每个自动管道到单独的日志文件 每个进程将同时运行几分钟 我想要两个日志文件 stdout and stderr 每个进程当进程运行
  • 使用 python 将文本发送到带有逗号分隔符的列

    如何使用分隔符 在 Excel 中将一列分成两列 并使用 python 命名标题 这是我的代码 import openpyxl w openpyxl load workbook DDdata xlsx active w active a a
  • 在 pip.conf 中指定多个可信主机

    这是我尝试在我的中设置的 etc pip conf global trusted host pypi org files pythonhosted org 但是 它无法正常工作 参考 https pip pypa io en stable
  • python中的sys.stdin.fileno()是什么

    如果这是非常基本的或之前已经问过的 我很抱歉 我用谷歌搜索但找不到简单且令人满意的解释 我想知道什么sys stdin fileno is 我在代码中看到了它 但不明白它的作用 这是实际的代码块 fileno sys stdin filen
  • 在pycharm中调试python代码

    这个问题类似于this https stackoverflow com questions 10240018 how to use pycharm to debug python script一 我正在尝试调试pyethapp https
  • 使用 Doc2vec 后如何解释 Clusters 结果?

    我正在使用 doc2vec 将关注者的前 100 条推文转换为矢量表示形式 例如 v1 v100 之后 我使用向量表示来进行 K 均值聚类 model Doc2Vec documents t size 100 alpha 035 windo
  • Plotly:如何避免巨大的 html 文件大小

    我有一个 3D 装箱模型 它使用绘图来绘制输出图 我注意到 绘制了 600 个项目 生成 html 文件需要很长时间 文件大小为 89M 这太疯狂了 我怀疑可能存在一些巨大的重复 或者是由单个项目的 add trace 方法引起的 阴谋 为
  • Google App Engine 中的自定义身份验证

    有谁知道或知道我可以在哪里学习如何使用 Python 和 Google App Engine 创建自定义身份验证流程 我不想使用 Google 帐户进行身份验证 并且希望能够创建自己的用户 如果不是专门针对 Google App Engin
  • 从 dask 数据框中的日期时间序列获取年份和星期?

    如果我有一个 Pandas 数据框和一个日期时间类型的列 我可以按如下方式获取年份 df year df date dt year 对于 dask 数据框 这是行不通的 如果我先计算 像这样 df year df date compute
  • PyQt 中的线程和信号问题

    我在 PyQt 中的线程之间进行通信时遇到一些问题 我使用信号在两个线程 发送者和监听者 之间进行通信 发送者发送消息 期望被监听者接收 但是 没有收到任何消息 谁能建议可能出了什么问题 我确信这一定很简单 但我已经环顾了几个小时但没有发现
  • 如何使用 Django (Python) 登录表单?

    我在 Django 中构建了一个登录表单 现在我遇到了路由问题 当我选择登录按钮时 表单不会发送正确的遮阳篷 我认为前端的表单无法从 查看 py 文件 所以它不会发送任何 awnser 并且登录过程无法工作 该表单是一个简单的静态 html

随机推荐

  • 从 Maven 设置 TestNG 的详细级别

    当我运行测试时 我讨厌盯着闪烁的光标而不知道正在运行什么 为了解决这个问题 我在所有测试中添加了完成消息 然而我意识到这是一个非常老套的解决方案并且增加了一些废话 假设TestNG的详细级别打印测试描述 我如何在Maven中设置详细级别 请
  • 查找出现次数最多的单词

    搜索文档中出现次数最多的单词的最佳方法 算法 是什么 查找文档中出现次数最多的单词可以通过简单的 O n 时间复杂度完成直方图 http en wikipedia org wiki Histogram 基于哈希 histogram lt n
  • 正则表达式在特定单词模式处分割字符串

    我正在尝试拆分一个可能如下所示的字符串 International Bank for Reconstruction Development NAICS 928120 SIC 6081 World Bank NAICS 928120 SIC
  • 在接到电话时将应用程序置于最前面

    当我接到电话时 我想将我的应用程序带到电话接听屏幕前面 我在接到电话后完成了所有编码部分 但该应用程序并没有出现在前面 它刚刚打开并停留在电话应答屏幕下方 我想将我的应用程序带到此屏幕前面 我做了如下的事情 Intent i new Int
  • 如何在 Swift 3 中为在 for 循环期间修改的数组编写 for 循环?

    所以 我有一个与此类似的 for 循环 for var i 0 i lt results count i 1 if results i lt 5 results removeAtIndex i i 1 这曾经有效 但是当我将其更改为首选 S
  • 什么是 CLR 类?

    我在 google 上搜索了 CLR 并从 wikipedia 找到了它是什么 但我想知道 CLR 类或更具体地说 CLR 实体类型是什么 尤其是在 ASP NET 中 CLR 不是类 公共语言运行时 CLR 是 Microsoft NET
  • Blob.generate_signed_url() 失败 AttributeError

    因此 我尝试使用以下方法为我的 Google Cloud Storage 对象生成临时的全局可读 URLgoogle cloud storagePython 库 https googlecloudplatform github io goo
  • CSS“ch”单元的意外行为

    我正在使用ch用于指定宽度的 CSS 单位div包含文本 我使用的是等宽字体 但是 如果我设置width 80ch 我第一个得到 80 个字符n行 其中n始终是 24 不确定这是否重要 但从那时起只有 79 个字符 这如下面的屏幕截图所示
  • PyCharm 和 reStructuredText (Sphinx) 文档弹出窗口

    让我们想象一下 我想看到一个简单方法的文档字符串弹出窗口PyCharm4 5 社区版 也在 5 0 中尝试过 我在两个文件中都写下了这些文档字符串epytext语法 自 2008 年起不再支持 Epydoc 生成器 并且仅适用于 Pytho
  • 无法以编程方式减小 gtk 窗口的大小

    以编程方式调整 gtk 窗口大小时 我似乎遇到了问题 问题是 一旦我将窗口的宽度和高度增加到 800x600 我似乎无法将其缩小回原来的大小 400x200 下面是示例代码 有人遇到过这样的问题吗 include
  • Selenium IDE - 导出测试脚本

    我正在尝试导出在 Selenium IDE 中创建的测试自动化 但找不到导出选项 我有一些测试场景 其中测试是相同的 但我需要复制现有测试并交换一些 ID 才能使其正常工作 我只能将其保存为 side 文件 而不能保存为 Selenium
  • glutTimerFunc问题

    I use Glut制作一个简单的动画 在主函数中 glutTimerFunc TIMERMSECS animate 0 叫做 这两段代码生成相同的图形 const int TIMERMSECS 20 float animation tim
  • 删除android进度条中的进度条背景

    如何去掉灰色背景 只在进度条中显示蓝色进度条 我已经回答过一个有类似要求的问题 Result 要删除它 简单地通过 id 搜索背景并尝试隐藏它是行不通的 要删除背景 我必须创建与系统版本相同的绘图并删除背景项目 TL DR 创建文件prog
  • 如何确保 Data.Vector 的摊销 O(n) 级联?

    我有一个应用程序 在其中使用向量作为代码的一部分是有效的 然而 在计算过程中我需要跟踪一些元素 我听说你可以从 Data Vectors 获得 O n 摊销串联 通过通常的数组增长技巧 但我认为我做得不对 假设我们有以下设置 import
  • 循环遍历节点列表 JS

    我的问题是 我正在尝试通过 Hot 类的 NODELIST 我想将他们的 className 更改为 cool 当我使用 for 循环时 它的第二个 li 似乎没有改变颜色 有谁知道我在这里犯了什么错误 第二个 li 元素没有改变颜色 谢谢
  • 如何更改 NSPopover 背景颜色包括三角形部分?

    我该如何改变NSPopover背景颜色包括三角形部分吗 它实际上要简单得多 并且您不需要私有 API 使视图控制器的根视图成为自定义类 implementation MyPopoverRootView void viewDidMoveToW
  • 在 Python 中为方法生成控制流图的最简单方法是什么?

    我正在编写一个程序来尝试比较两种方法 我想为所有匹配的方法生成控制流图 CFG 并使用拓扑排序来比较两个图 有一个Python包叫做staticfg https pypi org project staticfg 它正是从一段 Python
  • 为什么不再需要指明ByVal/ByRef?

    我刚刚安装了 Visual Studio 2010 Service Pack 在 Windows Update 上建议 我可以看到 intellisense 上的一个新功能 这意味着当我编写Function or Sub在 VB NET 中
  • Linux 上的 JDK 1.8 缺少 JNI 包含文件

    我正在尝试编译以下项目 https github com entropia libsocket can java 我总是收到此错误消息 有谁知道如何修复它 这可能是 Linux x64 Debian Wheezy 上 JDK 1 8 0 1
  • 自定义类型.NamedTuple

    我在用着NamedTuples来保存数据 我想添加一个可以被多个继承的方法NamedTuple基础课程 但是当我尝试使用多重继承或子类化时NamedTuple基于类 它不起作用 具体来说 我试图自动为所有数据类提供一个方法 该方法可以查看类