Корректировка 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)