Pregunta

Tengo un C clase Python que deben tener dos-dicts seudo a y b. El término pseudo-Dicts medios que los diccionarios en realidad no existen y que son “vuelven a calcular” cada vez que se acceda a una tecla.

En este pseudocódigo sería el siguiente:

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'

Me podría implementar una clase de a y b, pero ya que ambos tienen sólo unos pocos métodos cortos, me pregunto si hay una manera más elegante y compacto para hacer esto.

¿Fue útil?

Solución

¿Por qué no definir su propia clase?

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']

No estoy seguro de que los valores de estos 'pseudo-predice' están viniendo, por lo que tendrá que actualizar el método __getitem__.

Otros consejos

¿Así?

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

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

O tal como esto para funciones de cálculo real?

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']
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top