如何使 python 数据类可哈希?

2024-03-05

我有一个数据类,我想使用以下方法对其实例进行哈希和排序id会员作为钥匙。

from dataclasses import dataclass, field

@dataclass(eq=True, order=True)
class Category:
    id: str = field(compare=True)
    name: str = field(default="set this in post_init", compare=False)

我知道我可以实施__hash__我。但是,我希望数据类为我完成这项工作,因为它们旨在处理这个问题。


不幸的是,上面的数据类失败了:

a = sorted(list(set([ Category(id='x'), Category(id='y')])))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'Category'

From the docs https://docs.python.org/3/library/dataclasses.html#dataclasses.dataclass:

以下是管理隐式创建的规则__hash__() method:

[...]

If eq and frozen默认情况下都是 truedataclass()将要 生成一个__hash__()方法给你。 If eq是真的并且frozen是假的,__hash__()将被设置为None,将其标记为不可散列 (确实如此,因为它是可变的)。如果eq是假的,__hash__()将保持不变意味着__hash__()的方法 将使用超类(如果超类是对象,这意味着它 将回退到基于 id 的哈希)。

既然你设置了eq=True离开frozen在默认情况下(False),你的数据类是不可散列的。

您有 3 个选择:

  • Set frozen=True(与默认值结合使用eq=True),这将使你的类不可变且可散列。
    @dataclass(frozen=True)
    
  • Set unsafe_hash=True,这将创建一个__hash__方法,但让你的类保持可变。
    @dataclass(unsafe_hash=True)
    
    如果类的实例在存储在字典或集合中时被修改,则可变性会带来问题:
    cat = Category('foo', 'bar')
    categories = {cat}
    cat.id = 'baz'
    
    print(cat in categories)  # False
    
  • 手动实施__hash__ method.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使 python 数据类可哈希? 的相关文章

随机推荐

  • 帮助在 Node.js 中需要 npm 模块

    我觉得我在这里缺少一些非常基本的东西 所以我安装了一个 npm 库npm install somelib 根据我读过的内容 我应该能够简单地做一个 var somelib require somelib 但它找不到任何东西 我确实有一个no
  • Chrome 中的 ScriptManager.RegisterHiddenField

    我正在处理一些利用 ScriptManager RegisterHiddenField 来跟踪数据模型修改的代码 它在 IE 和 FF 中运行良好 但在 Chrome 中遇到问题 如果您添加以下内容 就会出现该问题的一个简单示例 prote
  • 如何获取 ClickOnce 应用程序的文件夹路径

    我需要在控制台 ClickOnce 所在的同一文件夹中写入一个文件 application 可执行文件 驻留 它从中启动的文件夹 我尝试使用Application StartupPath Path GetDirectoryName Asse
  • 在C中缩小文件

    如何用 C 语言缩小文件 例如 如果我打开一个 2mb 的文件 做了一些工作并决定只有 1mb 的文件仍然存在 这是如何完成的 我知道如何使用 write fd 写入文件 但是如果我想在文件中间切出某些部分或截断它怎么办 您可能正在寻找tr
  • 组合多个控件的控件子类

    我正在尝试扩展 TextBox 以在其左侧添加一个标签并将其视为一个控件 这样我就不必跟踪它们的大小 位置等 我创建了一个扩展 Control 并具有 TextBox 和 Label 字段的 TextBoxWithLabel 类 但我不太确
  • BASH_REMATCH 不捕获

    我正在尝试捕获 bash 中路径的一部分 Input Users foo virtualenvs venv test server Code bin zsh regex venv if VIRTUAL ENV regex then echo
  • 将图像插入 MySQL 数据库或从 MySQL 数据库查看图像

    我在数据库中插入图像时遇到问题 该表具有以下结构 id gt INT 3 gt 自动增量 名称 gt VARCHAR 30 扩展名 gt VARCHAR 10 可能太短 img gt 中型BLOB 插入图像的PHP代码是 if FILES
  • 通过滚动移动 DIV

    我正在创建一个 jQuery 滚动条 它滚动 中的内容 这就像jQuery 滚动窗格 http jscrollpane kelvinluck com 我已经到了需要移动滚动按钮的地步 我的问题是 在没有任何 UI 插件的情况下 最好的方法是
  • 如果我加载一个包含 (ns my-namespace) 的文件,为什么它不切换我当前的命名空间?

    我有一个这样的文件 ns boston core If I load boston core 然而 从 REPL 来看 我的 ns 没有改变为boston但仍然存在user 为什么是这样 这是因为 load 只是加载指定的文件 到 bost
  • 从 glm 中提取 p 值

    我正在运行许多回归 并且只对一个特定变量的系数和 p 值的影响感兴趣 因此 在我的脚本中 我希望能够从 glm 摘要中提取 p 值 获取系数本身很容易 我知道查看 p 值的唯一方法是使用 summary myReg 还有其他办法吗 e g
  • 如何检测会话何时结束

    有没有办法检测有人离开您的网站 到目前为止我知道如何使用ignore user abort 但据我所知 这就是了 我需要知道这一点的原因是因为我需要一个脚本来在有人离开网站时执行 在数据库中为每个用户记录一个时间戳 并在每次页面加载时 或通
  • 如何暂时禁用“返回值可能未定义”警告?

    我想在代码中禁用特定警告 W1035 因为我认为编译器对此警告是错误的 function TfrmNagScreen Run TOption begin if ShowModal mrOk then Result TOption rdgAc
  • Bootstrap 3 导航栏链接不起作用

    我有一个带有链接的导航栏 品牌 链接有效 但没有任何内容ul做 我读过关于e preventDefault 当它与 ul nav gt li click function e 我也读过它与z index 我没有发现任何这样的情况 除非我找不
  • Heiken Ashi 使用 pandas python

    I was defining a function Heiken Ashi which is one of the popular chart type in Technical Analysis I was writing a funct
  • Android DatePicker 显示月份名称

    我正在尝试使用日期选择器 并且在选择时我想以以下格式显示日期 月份名称 日期 年份 final Calendar c Calendar getInstance mYear c get Calendar YEAR 13 mMonth c ge
  • 使用 constexpr auto/char-array 变量观察到的不同行为

    跟进这个问题拥有 constexpr 静态字符串会导致链接器错误 https stackoverflow com questions 34792403 having a constexpr static string gives a lin
  • 为什么这个程序用“YES”和“true”产生不同的结果?

    这是完整的程序 你能找出它的控制台输出吗 import
  • 使用 jQuery 求数组中值的总和[重复]

    这个问题在这里已经有答案了 我有一个包含一些值的数组 我想得到它们的总和 这是示例 var somearray 20 40 80 400 我想使用 jQuery 对这些值求和 在此示例中 结果将为 540 也可以处理浮点数 旧 JavaSc
  • 对于自定义类,Python 相当于 C++ begin() 和 end()

    假设您有一个字典 其键是整数 这些值也是字典 其键是字符串 其值是 numpy 数组 就像是 custom 1 a np zeros 10 b np zeros 100 2 c np zeros 20 d np zeros 200 我在代码
  • 如何使 python 数据类可哈希?

    我有一个数据类 我想使用以下方法对其实例进行哈希和排序id会员作为钥匙 from dataclasses import dataclass field dataclass eq True order True class Category