Точечная нотация в стиле Javascript для словарных ключей unpythonic? - PullRequest
25 голосов
/ 22 октября 2008

Я начал использовать конструкции, подобные этим:

class DictObj(object):
    def __init__(self):
        self.d = {}
    def __getattr__(self, m):
        return self.d.get(m, None)
    def __setattr__(self, m, v):
        super.__setattr__(self, m, v)

Обновление: на основе этого потока я изменил реализацию DictObj:

class dotdict(dict):
    def __getattr__(self, attr):
        return self.get(attr, None)
    __setattr__= dict.__setitem__
    __delattr__= dict.__delitem__

class AutoEnum(object):
    def __init__(self):
        self.counter = 0
        self.d = {}
    def __getattr__(self, c):
        if c not in self.d:
            self.d[c] = self.counter
            self.counter += 1        
        return self.d[c]

где DictObj - это словарь, доступ к которому можно получить с помощью точечной нотации:

d = DictObj()
d.something = 'one'

Я нахожу это более эстетичным, чем d['something']. Обратите внимание, что доступ к неопределенному ключу возвращает None вместо вызова исключения, что тоже неплохо.

Обновление: Smashery делает хорошую мысль, которую mhawke расширяет для более простого решения. Мне интересно, есть ли нежелательные побочные эффекты использования dict вместо определения нового словаря; если нет, то мне очень нравится решение Мхавке.

AutoEnum - это автоинкрементный Enum, используемый следующим образом:

CMD = AutoEnum()

cmds = {
    "peek":  CMD.PEEK,
    "look":  CMD.PEEK,
    "help":  CMD.HELP,
    "poke":  CMD.POKE,
    "modify": CMD.POKE,
}

Оба работают хорошо для меня, но я чувствую себя неуверенно по отношению к ним.

Это на самом деле плохие конструкции?

Ответы [ 11 ]

0 голосов
/ 05 июля 2012

Поскольку вы просите о нежелательных побочных эффектах:

Недостатком является то, что в визуальных редакторах, таких как eclipse + pyDev, вы увидите много неопределенных ошибок переменных в строках с использованием точечной нотации. Pydef не сможет найти такие определения «объекта» во время выполнения. Принимая во внимание, что в случае обычного словаря он знает, что вы просто получаете словарную запись.

Вам необходимо: 1) игнорировать эти ошибки и жить с красными крестиками; 2) подавлять эти предупреждения построчно, используя # @ UndefinedVariable, или 3) полностью отключать неопределенную ошибку переменной, в результате чего вы пропускаете реальные неопределенные определения переменных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...