简体   繁体   中英

Error: unhashable type: 'dict' with @dataclass

I have a 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]

And need to create such dictionary:


table = Table(*args)
{table: 'id'}

TypeError: unhashable type: 'dict'

Don't understand what's the problem.

The autogenerated hash method isn't safe, since it tries to hash the unhashable attributes signature , primary_key , and indexed . You need to define your own __hash__ method that ignores those attributes. One possibility is

def __hash__(self):
    return hash((self.name, self.primary_key))

Both self.name and self.primary_key are immutable, so a tuple containing those values is also immutable and thus hashable.


An alternative to defining this method explicitly would be to use the field function to turn off the mutable fields for hashing purposes.

@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 has a hash parameter whose default value is the value of compare , and the documentation discourages using a different value for hash . (Probably to ensure that equal items hash identically.) It's unlikely that you really want to use these three fields for the purposes of comparing two tables, so you this should be OK.

I would consult the documentation rather than relying on my relatively uninformed summary of it.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM