Псевдо-диктанты как свойства - PullRequest
3 голосов
/ 26 августа 2010

У меня есть класс Python C, который должен иметь два псевдо- dict s a и b.Термин «псевдо-диктанты» означает, что словари на самом деле не существуют и что они «пересчитываются» при каждом обращении к ключу.

В псевдокоде это будет выглядеть так:

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'

Я мог бы реализовать класс для a и b, но, поскольку оба имеют всего несколько коротких методов, мне интересно, есть ли более элегантный и компактный способ сделать это.

Ответы [ 2 ]

1 голос
/ 26 августа 2010

Как это?

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

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

Или может быть так для реальных функций расчета?

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']
1 голос
/ 26 августа 2010

Почему бы просто не определить свой собственный класс?

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

Я не уверен, откуда берутся значения для этих «псевдо-диктов», поэтому вам придется обновить метод __getitem__.

...