首页 > 解决方案 > 如何在字典中使用数据类?

问题描述

这是我的代码:

from dataclasses import dataclass
from typing import Callable

@dataclass
class MyDataClass:
    first: str
    second: str
    func: Callable


def some_func():
    return 'hello_world'

def some_func2():
    return 'hello_world2'


OPTIONS = {
    MyDataClass('my_arg', 'my_new_arg', some_func),
    MyDataClass('my_arg2', 'my_new_arg2', some_func2)
}

for arg1, arg2, func in OPTIONS.items():
    do_work(arg1, arg2, func, ...)

执行时我得到:

TypeError: unhashable type: 'MyDataClass'

我不确定是什么问题。我的目标是能够将 OPTIONS 的值发送到do_work. 可能 OPTIONS 不应该是一个字典,但我不确定这里适合什么类型。

标签: python

解决方案


那不是字典 ( {k1: v1, k2: v2}),那是集合 ( {v1, v2})

设置条目(和字典键)需要是可散列的。

默认情况下,Dataclass 实例不可散列,因为它们默认是可变的。

您需要frozen=True@dataclass装饰器中进行设置以使它们不可变,从而可散列。

此外,您不能dataclass像那样解压,您需要访问属性。

from dataclasses import dataclass
from typing import Callable


@dataclass(frozen=True)
class MyDataClass:
    first: str
    second: str
    func: Callable


def some_func():
    return 'hello_world'


def some_func2():
    return 'hello_world2'


def do_work(dc):
    print(dc.first, dc.second, dc.func)


OPTIONS = {
    MyDataClass('my_arg', 'my_new_arg', some_func),
    MyDataClass('my_arg2', 'my_new_arg2', some_func2)
}

for dc in OPTIONS:
    do_work(dc)

这打印出来

my_arg2 my_new_arg2 <function some_func2 at 0x10fb12280>
my_arg my_new_arg <function some_func at 0x10fa48b80>

推荐阅读