8
votes

DefaultDict avec un paramètre sur le constructeur de classe

[Python 3.1]

Je veux defaultDict (int) , sauf que je voudrais que la valeur par défaut soit 1 plutôt que 0 . .

  1. Y a-t-il une façon Neate de faire ça?
  2. Dois-je faire ça?

0 commentaires

4 Réponses :


15
votes
>>> a = defaultdict(lambda: 1)

1 commentaires

ou a = defaultDict (lambda: 1)



1
votes

de la DOCS:

La fonction INT () qui renvoie toujours zéro n'est qu'un cas particulier de fonctions constantes. Un moyen plus rapide et plus flexible de créer des fonctions constantes est d'utiliser itheroTools.Repeat () qui peut fournir toute valeur constante (non seulement zéro): xxx


9 commentaires

J'avais lu que dans les docs récemment et que je ne pouvais pas croire qu'ils ont suggéré d'utiliser iTertools.repeat () quand un lambda comme @gnibbler suggère que le @gnibbler suggère que fonctionne aussi bien, est plus simple et implique beaucoup moins de frais généraux - parlez de surkill ...


Ouais je ne suis pas sûr. Peut-être qu'il y a un gain de performance, je vais le tester plus tard


Je suis heureux de voir une alternative moins lambda.


def constante_factory (valeur): valeur de retour est aussi lambda-moins


@Johnlarooy à utiliser que vous devriez l'envelopper dans une fonction partielle, ce qui a probablement le plus de frais généraux de toutes les suggestions.


Doh. Je n'avais évidemment pas mon café avant d'écrire ça. Bien sûr, j'étais penser de quelque chose comme cette fermeture def constante_factory (valeur): DEF F (): Valeur de retour Retour F qui ne peut pas être écrit sur une ligne, mais équivalent à def constante_factory (valeur): retour Lambda: valeur si je n'essayais pas d'éviter la Lambda :)


@Johnlarooy; Désolé de demander très tard, mais pourriez-vous expliquer pourquoi "valeur de retour" ne fonctionnerait pas et que vous auriez à "encapsuler" une fonction dans une autre pour le faire fonctionner?


@Andojurai, la diffusion par défaut appelle tout ce que vous avez fourni comme argument sans argument, il doit donc être appelable. Types tels que int , str , list , dict sont tous appelables (par exemple, essayez int () ). Vous pouvez également utiliser une fonction de cours ou une instance avec un __ appel __ méthode


@Johnlarooy merci. Je l'ai triée en fait, je peux en effet faire une "fonction def direct (): retourner ce que je veux" Définition, la capture ait quelque chose d'appelable;)



4
votes
>>> from collections import defaultdict
>>> a = defaultdict(lambda: 1)
>>> a["foo"] += 1
>>> a["foo"]
2

0 commentaires

0
votes

avec partiel, vous pouvez créer une fonction avec des paramètres par défaut: xxx pré>

et une classe se comporte comme une fonction qui crée un objet. p>

Les paramètres de mots-clés peuvent être utilisés, EX.:

from functools import partial
from collections import defaultdict

class Rectangle:

   def __init__(x, y, l=10, h=20):
      self.x = x
      self.y = y
      self.l = l
      self.h = h

TopSquare30 = partial(Rectangle, 0, 0, l=30, h=30)

rectangles = defaultdict(TopSquare30)
john_square = rectangles['john']
paul_square = rectangles['paul']


0 commentaires