Une classe a un constructeur qui prend un paramètre:
class C(object):
def __init__(self, v):
self.v = v
...
Quelque part dans le code, il est utile pour les valeurs d'un dict de connaître leurs clés.
Je souhaite utiliser un defaultdict avec la clé transmise aux valeurs par défaut du nouveau-né:
d = defaultdict(lambda : C(here_i_wish_the_key_to_be))
Aucune suggestion?
python
dictionary
defaultdict
Benjamin Nitlehoo
la source
la source
defaultdict
la__missing__()
méthode de s peut être surchargée (comme c'est le cas dans n'importe quelle sous-classe de la classe intégréedict
depuis la version 2.5).Non, il n'y en a pas.
L'
defaultdict
implémentation ne peut pas être configurée pour transmettre les données manquanteskey
au prêt à l'default_factory
emploi. Votre seule option est d'implémenter votre propredefaultdict
sous-classe, comme suggéré par @JochenRitzel, ci-dessus.Mais ce n'est pas «intelligent» ou presque aussi propre qu'une solution de bibliothèque standard le serait (si elle existait). Ainsi, la réponse à votre question succincte oui / non est clairement «non».
C'est dommage que la bibliothèque standard ne dispose pas d'un outil aussi souvent nécessaire.
la source
Je ne pense pas que vous ayez besoin
defaultdict
ici du tout. Pourquoi ne pas simplement utiliser ladict.setdefault
méthode?Cela créerait bien sûr de nombreux exemples de
C
. Au cas où c'est un problème, je pense que l'approche la plus simple fera l'affaire:Ce serait plus rapide que la
defaultdict
ou toute autre alternative pour autant que je sache.ETA concernant la vitesse du
in
test par rapport à l'utilisation de la clause try-except:la source
d[key]
pour revenird[key] = C(key)
sikey not in d
. Mais votre solution l'oblige à y aller et à pré-réglerd[key]
à l'avance? Comment saurait-il ce dontkey
il a besoin?Voici un exemple fonctionnel d'un dictionnaire qui ajoute automatiquement une valeur. La tâche de démonstration pour trouver des fichiers en double dans / usr / include. Notez que le dictionnaire personnalisé PathDict ne nécessite que quatre lignes:
la source