Error: unhashable type: 'dict' with @dataclass
Error: unhashable type: 'dict' with @dataclass
我有一个 class Table:
@dataclass(frozen=True, eq=True)
class Table:
name: str
signature: Dict[str, Type[DBType]]
prinmary_key: str
foreign_keys: Dict[str, Type[ForeignKey]]
indexed: List[str]
并且需要创建这样的字典:
table = Table(*args)
{table: 'id'}
TypeError: unhashable type: 'dict'
不明白是什么问题
自动生成的散列方法不安全,因为它试图散列不可散列的属性 signature
、primary_key
和 indexed
。您需要定义自己的 __hash__
方法来忽略这些属性。一种可能是
def __hash__(self):
return hash((self.name, self.primary_key))
self.name
和 self.primary_key
都是不可变的,因此包含这些值的元组也是不可变的,因此是可散列的。
显式定义此方法的另一种方法是使用 field
函数关闭用于哈希目的的可变字段。
@dataclass(frozen=True, eq=True)
class Table:
name: str
signature: Dict[str, Type[DBType]] = field(compare=False)
prinmary_key: str
foreign_keys: Dict[str, Type[ForeignKey]] = field(compare=False)
indexed: List[str] = field(compare=False)
field
有一个 hash
参数,其默认值为 compare
的值,文档不鼓励对 hash
使用不同的值。 (可能是为了确保相同的项目散列相同。)您不太可能真的想使用这三个字段来比较两个表,所以您应该没问题。
我会参考文档,而不是依赖于我相对不了解的总结。
我有一个 class Table:
@dataclass(frozen=True, eq=True)
class Table:
name: str
signature: Dict[str, Type[DBType]]
prinmary_key: str
foreign_keys: Dict[str, Type[ForeignKey]]
indexed: List[str]
并且需要创建这样的字典:
table = Table(*args)
{table: 'id'}
TypeError: unhashable type: 'dict'
不明白是什么问题
自动生成的散列方法不安全,因为它试图散列不可散列的属性 signature
、primary_key
和 indexed
。您需要定义自己的 __hash__
方法来忽略这些属性。一种可能是
def __hash__(self):
return hash((self.name, self.primary_key))
self.name
和 self.primary_key
都是不可变的,因此包含这些值的元组也是不可变的,因此是可散列的。
显式定义此方法的另一种方法是使用 field
函数关闭用于哈希目的的可变字段。
@dataclass(frozen=True, eq=True)
class Table:
name: str
signature: Dict[str, Type[DBType]] = field(compare=False)
prinmary_key: str
foreign_keys: Dict[str, Type[ForeignKey]] = field(compare=False)
indexed: List[str] = field(compare=False)
field
有一个 hash
参数,其默认值为 compare
的值,文档不鼓励对 hash
使用不同的值。 (可能是为了确保相同的项目散列相同。)您不太可能真的想使用这三个字段来比较两个表,所以您应该没问题。
我会参考文档,而不是依赖于我相对不了解的总结。