python - 如何在字典中使用数据类?
问题描述
这是我的代码:
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 不应该是一个字典,但我不确定这里适合什么类型。
解决方案
那不是字典 ( {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>
推荐阅读
- javascript - 检索指向尚未定义的对象的引用值
- linux - Socat - 穷人的 http 服务器
- ontology - Protege 本体编辑器(解决缺少的导入)
- c# - 从 .NET(C#) 中的 Mutlipart/Mixed 响应中提取/解析二进制内容
- python - 如何将数据框导出为控件 python 中的分隔文件?
- python - Pandas 数据框获取每个组的第一行,保留 ID
- python - 使用子进程的多个 Pygame 实例
- wordpress - Nginx:重定向到移动设备上的 AMP 页面
- vue.js - VueX 商店似乎有一个关键字阻止“navigation.js”被导入
- newrelic - 按容器名称过滤日志