Question

J'ai un C de classe Python qui devrait avoir deux pseudo-dicts a et b. Le terme pseudo-Dicts signifie que les dictionnaires n'existent pas réellement et qu'ils sont « recalculées » chaque fois qu'une touche est accessible.

Dans ce pseudocode ressemblerait à ceci:

class C:
    def a.__getitem__(self, key):
        return 'a'
    def b.__getitem__(self, key):
        return 'b'

>>> c = C()
>>> c.a['foo']
'a'
>>> c.b['bar']
'b'

Je pourrais mettre en œuvre une classe pour a et b, mais puisque les deux ont quelques méthodes courtes, je me demande s'il y a un moyen de faire plus élégant et compact cela.

Était-ce utile?

La solution

Pourquoi ne pas simplement définir votre propre classe?

class PseudoDict(object):
    def __init__(self, c):
        self.c = c

    def __getitem__(self, key):
        return self.c.somethingmagical()

class C(object):
    def __init__(self):
        self.a = PseudoDict(self)
        self.b = PseudoDict(self)

c = C()
print c.a['foo']
print c.b['bar']

Je ne sais pas où les valeurs de ces proviennent de « pseudo-dicts », de sorte que vous devrez mettre à jour la méthode __getitem__.

Autres conseils

Comme cela?

from collections import defaultdict
class C:
    a = defaultdict(lambda:'a')
    b = defaultdict(lambda:'b')

c=C()
print c.a['foo']
print c.b['bar']

Ou peut-être comme celui-ci pour les fonctions de calcul réel?

from collections import defaultdict

class C:
    def __init__(self):
        self.a = defaultdict(self.geta)
        self.b = defaultdict(self.getb)
    def geta(self):
        return 'a'
    def getb(self):
        return 'b'

c=C()
print c.a['foo']
print c.b['bar']
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top