Я пытаюсь создать что-то следующее:
dictionary = {
'key1': ['val1','val2'],
'key2': @key1
}
где @ key1 - ссылка на словарь ['key1']. Заранее благодарю.
Я бы расширил версию Аарона Дигуллы.То, что у него сейчас, воспроизведено здесь:
class DictRef(object):
def __init__(self, d, key): self.d, self.key = d, key
d = {}
d.update({
'key1': ['val1','val2'],
'key2': DictRef(d, 'key1')
})
Я предполагаю, что он хочет воспроизвести истинную эталонную семантику, так что доступ к 'key2'
всегда даст вам возможность получить любой 'key1'
имеет значение. проблема в том, что d ['key1']
- это список
, d ['key2']
- это DictRef
. Итак, чтобы получить «значение» 'key1'
, все, что вам нужно сделать, это d ['key1']
, но для 'key2'
вы должны сделать d [d ['key2']. Key]
. Кроме того, у вас не может быть ссылки на ссылку, которая работает нормально, она будет выглядеть как d [d [d ['key2']. Key] .key]
. И как отличить ссылку от обычного значения? Вероятно, с помощью проверки типов с помощью isinstance (v, DictReference) ( ew ).
Итак, у меня есть предложение исправить все это.
Лично я не понимаю, зачем нужна истинная семантика ссылок. Если они кажутся необходимыми, их можно сделать ненужными путем реструктуризации проблемы или решения проблемы. Возможно даже, что в них никогда не было необходимости, и простое d.update (key2 = d ['key1'])
решило бы проблему.
Так или иначе, к предложению:
class DictRef(object):
def __init__(self, d, key):
self.d = d
self.key = key
def value(self):
return self.d[self.key].value()
class DictVal(object):
def __init__(self, value):
self._value = value
def value(self):
return self._value
d = {}
d.update(
key1=DictVal(['val1', 'val2']),
key2=DictRef(d, 'key1')
)
Теперь, чтобы получить значение любого ключа, будь то ссылка или нет, нужно просто сделать d [k] .value ()
. Если есть ссылки на ссылки, они будут правильно разыменованы в цепочке. Если они образуют действительно длинную или бесконечную цепочку, Python выдает ошибку RuntimeError из-за чрезмерной рекурсии.
Используйте новый класс:
class DictRef(object):
def __init__(self, d, key): self.d, self.key = d, key
d = {}
d.update({
'key1': ['val1','val2'],
'key2': DictRef(d, 'key1')
})
Обратите внимание на странный синтаксис, потому что у вас нет возможности узнать, внутри какого словаря вы создаете DictRef
.