QStandardItem 缺少 __hash__ 方法

2023-12-13

我发现在将一些 Python2/Qt4 代码转换为 Python3/Qt5 时,显然 QStandardItem 不能再用作字典键,因为它没有__hash__已实施,因此不再被认为是不可变的。

这两个片段显示了这个问题:

PyQt4:

>>> from PyQt4 import QtGui
>>> a = QtGui.QStandardItem()
>>> b = {}
>>> b[a] = "1"
>>> a.__hash__()
2100390

PyQt5:

>>> from PyQt5 import QtGui
>>> a = QtGui.QStandardItem()
>>> b = {}
>>> b[a] = "1"
TypeError: unhashable type: 'QStandardItem'
>>> a.__hash__()
TypeError: 'NoneType' object is not callable

为什么要进行更改?我不应该使用 QStandardItem 作为字典键吗?

明显的解决方法是子类化 QStandardItem 并重新实现一个简单的版本__hash__(我已经做到了)。但我有什么遗漏的吗?


在Qt中,有三个可散列性要求:

  1. 该类型必须是可分配的数据类型
  2. 该类型必须定义一个==操作员
  3. a qHash必须为类型定义函数

因此如果PyQt想要与Qt保持一致,它应该只定义__hash__当上述条件适用时,其实现应该简单地委托给任何人qHashQt 提供的函数。

将 Python 2 与 PyQt4/5 一起使用时的行为可能应该被视为错误功能,因为它给出的结果是not与Qt一致。通过查看以下类型会发生什么就可以看出这一点is可哈希(Qt 术语):

使用Python 3:

>>> a = QtCore.QUrl('foo.bar')
>>> b = QtCore.QUrl('foo.bar')
>>> a == b
True
>>> hash(a) == hash(b)
True

这正是我们想要的:对象compare平等,也应该hash平等的。但现在看看当使用相同版本的 PyQt 和 Python 2 时会发生什么:

>>> a = Qt.QUrl('foo.bar')
>>> b = Qt.QUrl('foo.bar')
>>> a == b
True
>>> hash(a) == hash(b)
False

似乎有类似物体的东西identity被使用的是__hash__Python 2 中的实现,显然与 Qt 的哈希语义不一致。

The QStandardItem班级有never在 Qt 中是可哈希的,因此为了一致性,PyQt 现在选择不提供__hash__的方法。并且自从实例QStandardItem事实上,它们是可变的,PyQt 相当合理地将其留给用户来决定何时定义__hash__,以及如何实施。为了与 Python 2 兼容,这可能会返回id(self).

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

QStandardItem 缺少 __hash__ 方法 的相关文章

  • Python Popen 与 psexec 挂起 - 不良结果

    我对 subprocess Popen 和我认为是管道的问题有疑问 我有以下代码块 从 cli 运行时 100 都不会出现问题 p subprocess Popen psexec serverName get cmd c ver echo
  • 如何在 AWS CDK 创建的 Python Lambda 函数中安装外部模块?

    我在 Cloud9 中使用 Python AWS CDK 并且我部署简单的 Lambda 函数那应该是发送 API 请求到 Atlassian 的 API当对象上传到 S3 存储桶时 也是由 CDK 创建的 这是我的 CDK 堆栈代码 fr
  • 使用 python 进行串行数据记录

    Intro 我需要编写一个小程序来实时读取串行数据并将其写入文本文件 我在读取数据方面取得了一些进展 但尚未成功地将这些信息存储在新文件中 这是我的代码 from future import print function import se
  • 我怎样才能更多地了解Python的内部原理? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我使用Python编程已经有半年多了 我对Python内部更感兴趣 而不是使用Python开发应用程序
  • 如何正确地将 MIDI 刻度转换为毫秒?

    我正在尝试将 MIDI 刻度 增量时间转换为毫秒 并且已经找到了一些有用的资源 MIDI Delta 时间刻度到秒 http www lastrayofhope co uk 2009 12 23 midi delta time ticks
  • Python模块可以访问英语词典,包括单词的定义[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个 python 模块 它可以帮助我从英语词典中获取单词的定义 当然有enchant 这可以帮助我检查该单词是否存在于英语中
  • 如何迭代按值排序的 Python 字典?

    我有一本字典 比如 a 6 b 1 c 2 我想迭代一下by value 不是通过键 换句话说 b 1 c 2 a 6 最直接的方法是什么 sorted dictionary items key lambda x x 1 对于那些讨厌 la
  • Django 模型在模板中不可迭代

    我试图迭代模型以获取列表中的第一个图像 但它给了我错误 即模型不可迭代 以下是我的模型和模板的代码 我只需要获取与单个产品相关的列表中的第一个图像 模型 py class Product models Model title models
  • Argparse nargs="+" 正在吃位置参数

    这是我的解析器配置的一小部分 parser add argument infile help The file to be imported type argparse FileType r default sys stdin parser
  • 切片 Dataframe 时出现 KeyError

    我的代码如下所示 d pd read csv Collector Output csv df pd DataFrame data d dfa df copy dfa dfa rename columns OBJECTID Object ID
  • 在Python中调整图像大小

    我有一张尺寸为 288 352 的图像 我想将其大小调整为 160 240 我尝试了以下代码 im imread abc png img im resize 160 240 Image ANTIALIAS 但它给出了一个错误TypeErro
  • 为什么在 Python 2.4 中使用 Unicode 数据会出现 ASCII 编码错误,而在 2.7 中却不会?

    我有一个程序 当在 Python 2 7 中运行时 会生成正确的 Unicode 输出到标准输出 当在 Python 2 4 中运行时 我得到UnicodeEncodeError ascii codec can t encode chara
  • Python urllib.request.urlopen:AttributeError:'bytes'对象没有属性'data'

    我正在使用 Python 3 并尝试连接到dstk 我收到错误urllib包裹 我对SO进行了很多研究 但找不到与这个问题类似的东西 api url self api base street2coordinates api body jso
  • 从 python 发起 SSH 隧道时出现问题

    目标是在卫星服务器和集中式注册数据库之间建立 n 个 ssh 隧道 我已经在我的服务器之间设置了公钥身份验证 因此它们只需直接登录而无需密码提示 怎么办 我试过帕拉米科 它看起来不错 但仅仅建立一个基本的隧道就变得相当复杂 尽管代码示例将受
  • 如何设置 Celery 来调用自定义工作器初始化?

    我对 Celery 很陌生 我一直在尝试设置一个具有 2 个独立队列的项目 一个用于计算 另一个用于执行 到目前为止 一切都很好 我的问题是执行队列中的工作人员需要实例化一个具有唯一 object id 的类 每个工作人员一个 id 我想知
  • 在 Pandas 中使用正则表达式的多种模式

    我是Python编程的初学者 我正在探索正则表达式 我正在尝试从 描述 列中提取一个单词 数据库名称 我无法给出多个正则表达式模式 请参阅下面的描述和代码 描述 Summary AD1 Low free DATA space in data
  • Python 将日志滚动到变量

    我有一个使用多线程并在服务器后台运行的应用程序 为了无需登录服务器即可监控应用程序 我决定包括Bottle http bottlepy org为了响应一些HTTP端点并报告状态 执行远程关闭等 我还想添加一种查阅日志文件的方法 我可以使用以
  • 使用 PyTorch 分布式 NCCL 连接失败

    我正在尝试使用 torch distributed 将 PyTorch 张量从一台机器发送到另一台机器 dist init process group 函数正常工作 但是 dist broadcast 函数中出现连接失败 这是我在节点 0
  • 限制 django 应用程序模型中的单个记录?

    我想使用模型来保存 django 应用程序的系统设置 因此 我想限制该模型 使其只能有一条记录 极限怎么办 尝试这个 class MyModel models Model onefield models CharField The fiel
  • 具有自定义值的 Django 管理外键下拉列表

    我有 3 个 Django 模型 class Test models Model pass class Page models Model test models ForeignKey Test class Question model M

随机推荐

  • 面积图中的颜色变化

    我有一个扩展 AreaChart 的 Java 类 我想实现一种方法 或多或少是这样的 public void addNewColorToData xCoordinate yCoordinate redColor greenColor bl
  • 如何在普通 Python 3 中监听原始以太网帧?

    我正在用 Python 进行一些自学的低级网络编程 我在用着乌班图18 04 and Python 3 使用此代码 我可以发送原始以太网数据包 from socket import socket as Socket AF PACKET SO
  • 查找文本节点

    是否有一个聪明的 jQuery 选择器来选择这样的文本节点 div div
  • 如何从命令行获取正确的 Windows 版本

    如何从命令行 包括 PowerShell 获取正确的 Windows 版本 正如我尝试过的所有解决方案 答案如何从 PowerShell 命令行查找 Windows 版本 但现在没有人能够给出这个 您可以从注册表中检索它 gt e g 22
  • Java持久化API中FetchType LAZY和EAGER的区别?

    有什么区别FetchType LAZY and FetchType EAGER在 Java 持久性 API 中 有时您有两个实体 并且它们之间存在关系 例如 您可能有一个名为University另一个实体称为Student一所大学可能有很多
  • 如何在 Flutter 中使用 BottomNavigationBar 维护 Webview 状态

    我正在创建一个 Flutter 应用程序 它使用 BottomNavigationBar 在页面之间进行更改 在其中一个页面中 我有一个 Webview 我正在使用plugin由 Flutter 开发团队开发 当我导航到另一个选项卡然后返回
  • 这是创建审计跟踪的最佳方法吗?

    我正在尝试创建一些功能 以保留给定用户表单中的数据如何随时间变化的审计跟踪 并在该页面的底部提供带日期的审计 例如 02 04 09 21 49 名称从 Tom 更改为 Chris 我这样做的方法是将数据以其当前格式存储在会话中 然后在保存
  • X64 指令在不同 CPU 上表现不同

    在一次采访中 我被问到是否知道 x64 指令的行为取决于所使用的 CPU 我在任何地方都找不到任何相关文档 有谁知道这些指令是什么以及为什么会出现这种情况 有一些留下一个寄存器或一些带有未定义值的标志 英特尔和AMD 在这方面可能有所不同
  • FirebaseMessaging.instance.getInitialMessage() 不适用于启动画面

    在 GetX 状态管理的帮助下 我已将 Firebase Cloud Messaging 集成到我的 Flutter 移动应用中 我还使用 Laravel 和 Firebase Admin SDK 向我的应用程序发送通知 该通知在前台状态和
  • Dialogflow 将企业版 v2 集成到 ios 和 android 应用程序中

    我之前使用的是v1版本的dialogflow 然后他们宣布将暂停它 我将云函数中的代码迁移到了v2 但我找不到将其集成到 ios 和 android 应用程序中的方法 请帮帮我 谢谢 要将代理更新到 V2 您应该创建一个 Cloud Fun
  • 如何将 DataTable 设置为 DataGridComboBoxColum 的 ItemsSource?

    我有一个包含两列的 DataTable 我将它们绑定到 DataGridComboBoxColumn 的所有组合框 其中一列将是项目的文本 其他列将是项目的值 我知道名为 DisplayMemberPath 的属性是我将列的名称指定为项目文
  • WPF 颜色插值

    我正在尝试基于调色板绘制 WPF 控件的背景 其中每种颜色都分配有值 例如 红色 0 深绿 10 绿色 20 浅绿 30 和用户选择的值 例如 25 会给出最终的颜色 我希望生成的颜色是 2 个最接近的颜色值之间的插值 例如 对于 25 的
  • v-on:点击目标不在正确的元素中?

    我正在尝试对锚标记 使用 jQuery 做一些事情 比如在单击时更改它的颜色 但我似乎无法获得正确的目标 a span entry 1 span span entry 2 span a The 事件目标in action 是第一个或第二个跨
  • 在一个窗口中打开多个链接,然后在另一个窗口中打开多个链接

    有没有办法在浏览器中打开一堆3 4个链接window以及另外一堆 3 4 个链接另一个窗口 例如 链接 A facebook com instagram com twitter com 应在浏览器窗口中打开 chrome and 链接 B
  • 加密算法在 Android 2.1 和 2.1 以上版本上给出不同的结果

    在发布这个问题之前我已经搜索了很多 早些时候 代码可以在非 android 4 2 2 1 设备上运行 然后我用谷歌搜索并介绍了以下代码行 这部分解决了这个问题 即它现在可以在 4 2 设备上运行 但不能在 Froyo 上运行 if and
  • 如何使dialogFragment宽度与父级匹配?

    我有这个dialog fragmentt 我有两个问题 1 如何使宽度与父级匹配 请提供最干净 最好的解决方案 In the dialog fragment我有一个编辑文本 当对话框片段打开时 如何使其弹出软键盘 希望大家能够帮忙 这是我的
  • 使用 getDrawingCache 时是否有最大位图大小?

    我正在尝试创建文本的位图TextView 过去我用过这样做getDrawingCache 但是 现在我需要创建一个位图TextView文本比以前长得多 这正在造成getDrawingCache抛出 NullPointerException
  • 无法将加密数据转换为字符串

    我正在尝试学习使用 RNCryptor 这是我正在使用的 let key 1234 let original text hello let data original text data using utf8 let encrypted d
  • 通过模块 xml 文件 Magento 添加一些块到产品视图页面

    您好 我正在开发一个简单的扩展 其中 我需要通过 xml 文件在产品页面上插入一个新块 下面是我的模块的xml文件
  • QStandardItem 缺少 __hash__ 方法

    我发现在将一些 Python2 Qt4 代码转换为 Python3 Qt5 时 显然 QStandardItem 不能再用作字典键 因为它没有 hash 已实施 因此不再被认为是不可变的 这两个片段显示了这个问题 PyQt4 gt gt g