Исходя из вашего отзыва на мой первый ответ , звучит так, как будто вы хотите, что-то более или менее похожее на электронную таблицу. Ниже описано, как реализовать такой словарь. Он основан на ActiveState Рэймонда Хеттингера с этим именем с некоторыми изменениями и расширениями.
Обратите внимание, что за исключением особого случая аргументов ключевых слов, передаваемых при создании экземпляра класса, значения в нем должны быть все строки , а не числовые значения.
Также обратите внимание, что поскольку он использует eval()
, в целях безопасности его следует использовать только с входными данными из надежных источников.
Я думаю, что важно понимать, что, хотя класс Spreadsheet
, представленный ниже, технически не является словарем, он ведет себя во многом как (подкласс) и, если он используется вместо обычного словаря, даст вам возможности, которые вы хотеть. См. Описание отображение в глоссарии онлайн-документации.
from collections.abc import MutableMapping
class SpreadSheet(MutableMapping):
def __init__(self, tools=None, **kwargs):
self._cells = {}
for key, value in kwargs.items():
self._cells[key] = value if isinstance(value, str) else str(value)
self._tools = {'__builtins__': None} # Prevent eval() from supplying.
if tools is not None:
self._tools.update(tools) # Add any caller-supplied functions.
def clear(self):
return self._cells.clear()
def copy(self):
return self._cells.copy()
def __contains__(self, key):
return key in self._cells
def __setitem__(self, key, formula):
self._cells[key] = formula
def __getitem__(self, key):
return eval(self._cells[key], self._tools, self)
def __len__(self):
return len(self._cells)
def __iter__(self):
return iter(self._cells)
def __delitem__(self, key):
del self._cells[key]
def getformula(self, key):
""" Return raw un-evaluated contents of cell. """
return self._cells[key]
def update(self, *args, **kwargs):
for k, v in dict(*args, **kwargs).items():
self[k] = v
Пример использования:
d = SpreadSheet(a=1, b=2)
d.update({'x': 'x1',
'x1': 'a+2',
'x2': 'b+1',
'x3': 'a+b'})
xx = d['x']
print(xx) # -> 3