Ссылка на словарь Python для соседнего элемента словаря

Я пытаюсь создать что-то следующее:

dictionary = {
   'key1': ['val1','val2'],
   'key2': @key1
}

где @ key1 - ссылка на словарь ['key1']. Заранее благодарю.

7
задан frx 20 August 2010 в 13:23
поделиться

2 ответа

Я бы расширил версию Аарона Дигуллы.То, что у него сейчас, воспроизведено здесь:

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 из-за чрезмерной рекурсии.

4
ответ дан 7 December 2019 в 05:15
поделиться

Используйте новый класс:

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 .

4
ответ дан 7 December 2019 в 05:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: