CodeQL documentation

Unhashable object hashed

ID: py/hash-unhashable-value
Kind: problem
Security severity: 
Severity: error
Precision: very-high
Tags:
   - quality
   - reliability
   - correctness
Query suites:
   - python-security-and-quality.qls

Click to see the query in the CodeQL repository

If an object is used as a key in a dictionary or as a member of a set then it must be hashable, that is it must define a __hash__ method. All built-in immutable types are hashable, but mutable ones are not. Common hashable types include all numbers, strings (both unicode and bytes) and tuple. Common unhashable types include list, dict and set.

In order to store a key in a dict or set a hash value is needed. To determine this value the built-in function hash() is called which in turn calls the __hash__ method on the object. If the object’s class does not have the __hash__ method, then a TypeError will be raised.

Recommendation

Since this problem usually indicates a logical error, it is not possible to give a general recipe for fixing it. Mutable collections can be converted into immutable equivalents where appropriate. For example sets can be hashed by converting any instances of set into frozenset instances.

Example

lists are not hashable. In this example, an attempt is made to use a list as a key in a mapping which will fail with a TypeError.


def lookup_with_default_key(mapping, key=None):
    if key is None:
        key = [] # Should be key = ()
    return mapping[key]

References

  • © GitHub, Inc.
  • Terms
  • Privacy
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy