Pav*_*ich 8 python hashtable python-dataclasses
我有一个班级表:
@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]
Run Code Online (Sandbox Code Playgroud)
并需要创建这样的字典:
table = Table(*args)
{table: 'id'}
Run Code Online (Sandbox Code Playgroud)
类型错误:不可散列的类型:'dict'
不明白有什么问题。
che*_*ner 14
自动生成的哈希方法并不安全,因为它尝试对不可哈希的属性signature、primary_key和进行哈希处理indexed。您需要定义自己的__hash__方法来忽略这些属性。一种可能性是
def __hash__(self):
return hash((self.name, self.primary_key))
Run Code Online (Sandbox Code Playgroud)
和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)
Run Code Online (Sandbox Code Playgroud)
field有一个hash参数,其默认值为 的值compare,并且文档不鼓励使用不同的值hash。(可能是为了确保相等的项散列相同。)您不太可能真的想使用这三个字段来比较两个表,所以您这应该没问题。
我会查阅文档,而不是依赖我相对无知的总结。