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).