Supposons que j'ai un namedtuple
comme ceci:Comment fournir une initialisation supplémentaire pour une sous-classe de namedtuple?
EdgeBase = namedtuple("EdgeBase", "left, right")
Je veux mettre en œuvre une fonction de hachage personnalisé pour cela, donc je crée la sous-classe suivante:
class Edge(EdgeBase):
def __hash__(self):
return hash(self.left) * hash(self.right)
Puisque l'objet est immuable, je veulent la valeur de hachage à calculer une seule fois, donc je fais ceci:
class Edge(EdgeBase):
def __init__(self, left, right):
self._hash = hash(self.left) * hash(self.right)
def __hash__(self):
return self._hash
cela semble fonctionner, mais je ne suis vraiment pas sûr de ubclassing et initialisation en Python, en particulier avec les tuples. Y a-t-il des pièges à cette solution? Y a-t-il une manière recommandée comment faire ceci? Est-ce bien? Merci d'avance.
Les tests ont montré qu'il ne vaut pas la peine de mettre en cache la valeur de hachage, voir [numéro de dossier 9685] (https://mail.python.org/pipermail/python-bugs-list/2013-janvier/192363.html) –