Корректировка python autoviv для приращения "+=1"

Я использую некоторые общепринятые словари сборки кода для авививификации Python:

class autoviv(dict):
    """Implementation of perl's autovivification feature."""

    def __getitem__(self, item):  
        try:
            return dict.__getitem__(self, item)
        except KeyError:     
            value = self[item] = type(self)()
            return value

Единственное, что я хотел бы иметь, - это увеличивать значения в том случае, если в данный момент не существует ключа на указанном уровне вложенности словаря, используя += нотацию, например, так:

d['a']+=1

Это вернет ошибку:

TypeError: unsupported operand type(s) for +=: 'autoviv' and 'int'

Чтобы обойти это, я создал шаг, который проверяет, существует ли ключ, прежде чем увеличивать его, но я бы хотел покончить с этим шагом, если бы мог.

Как мне изменить приведенный выше код autoviv(), чтобы получить это улучшение? Я гуглил и пробовал разные подходы в течение нескольких часов, но без радости.

Спасибо за любой совет!

1 ответ

Автовивация уже в Python, внутри collections' defaultdict,

from collections import defaultdict


#Let's say we want to count every character
#  that occurs
text = "Let's implement autovivication!"
di = defaultdict(int)
for char in text:
    di[char] += 1
print(di)

#Another way of doing this is using a defualt string
#  (or default int, or whatever you want)
currentDict = {'bob':'password','mike':'12345'}
di = defaultdict(lambda:'unknown user', currentDict)
print(di['bob'])
print(di['sheryl'])

Тем не менее, если вы пытаетесь реализовать свой собственный. Вы должны назначить свой предмет, а затем получить ссылку на него.

def __getitem__(self, item):  
    try:
        return dict.__getitem__(self, item)
    except KeyError:
        value = self[item] = type(self)()        
        return dict.__getitem__(self, item)
Другие вопросы по тегам