Sobes.tech
Junior

Como determinar se um objeto é hashável?

sobes.tech IA

Resposta da IA

Um objeto é hashável se tiver um método __hash__() e __eq__() (em que objetos iguais têm o mesmo hash), ou se for um objeto incorporado imutável (como strings, números, tuplos), para os quais tal comportamento é garantido. Pode verificar-se usando a função hash(). Se ela for executada com sucesso, o objeto é hashável. Caso contrário, lançará um TypeError.

# Exemplo de objeto hashável (string)
string_obj = "hello"
try:
    hash_value_string = hash(string_obj)
    print(f"O objeto '{string_obj}' é hashável. Hash: {hash_value_string}")
except TypeError as e:
    print(f"O objeto '{string_obj}' não é hashável: {e}")

# Exemplo de objeto não hashável (lista)
list_obj = [1, 2, 3]
try:
    hash_value_list = hash(list_obj)
    print(f"O objeto '{list_obj}' é hashável. Hash: {hash_value_list}")
except TypeError as e:
    print(f"O objeto '{list_obj}' não é hashável: {e}")

# Exemplo de classe personalizada com implementação de __hash__ e __eq__
class MyHashable:
    def __init__(self, value):
        self.value = value

    def __hash__(self):
        return hash(self.value) # Delegar o hash ao valor interno

    def __eq__(self, other):
        if isinstance(other, MyHashable):
            return self.value == other.value
        return False

hashable_instance = MyHashable("example")
try:
    hash_value_custom = hash(hashable_instance)
    print(f"Objeto personalizado hashável. Hash: {hash_value_custom}")
except TypeError as e:
    print(f"Objeto personalizado não é hashável: {e}")

Também pode usar a função isinstance com collections.abc.Hashable (embora isso não garanta a correção de __eq__):

import collections

# Verificação com collections.abc.Hashable
print(f"String hashável? {isinstance('abc', collections.abc.Hashable)}")
print(f"Lista hashável? {isinstance([1, 2], collections.abc.Hashable)}")
print(f"Objeto personalizado hashável? {isinstance(hashable_instance, collections.abc.Hashable)}")

Objetos hasháveis são necessários para serem usados como chaves em dicionários (dict) e elementos em conjuntos (set).