自定义类型.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 的相关文章

随机推荐

  • 从 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基于类 它不起作用 具体来说 我试图自动为所有数据类提供一个方法 该方法可以查看类