Могу ли я варьировать объект как ссылку на словарь в Python - PullRequest
1 голос
/ 13 октября 2011

У меня есть ряд словарей, которые содержат значения, которые я хочу объединить в конце. Комбинация грязная, поэтому я не могу просто объединить словари, с которыми мне приходится работать, основываясь на клавишах, и сделать несколько осторожных выборов. Когда я создал словари, я создал их в элементе формы # Dict, ожидая что-то вроде

for value in ['8','10','11','12','13','14','15','18','19','20']:
    dictName='item'+value+'Dict'

но, как я быстро понял, dictName - это строка, а не ссылка на мой словарь.

Есть ли способ сделать ссылку на мой словарь, используя некоторый подход типа шаблона?

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

Спасибо

Ответы [ 3 ]

2 голосов
/ 13 октября 2011

Вы можете использовать функцию locals , чтобы получить словарь, содержащий переменные в текущей локальной области:

>>> var0 = 7
>>> var1 = 3
>>> var2 = 4
>>> var3 = 5
>>> for i in range(4):
...    print 'var', i, 'is', locals()['var%d' % i]
... 
var 0 is 7
var 1 is 3
var 2 is 4
var 3 is 5

Хотя я не очень рекомендую это делать. Я бы предложил поместить ваши переменные в словарь или список, как вы упоминали в своем посте.

1 голос
/ 13 октября 2011

eval() может сделать это:

>>> d = {'a':'first', 'b':'second'}
>>> d == eval('d')
True

Но будьте осторожны!Это скользкий склон.Использование eval() создает недостатки безопасности, это медленно и поощряет спагетти-код.

Интроспективные методы getattr и locals() аналогично рискованныОни мощные, и они позволяют вам делать вещи, которые будут занимать строки и строки C ++.Но они должны использоваться только тогда, когда это абсолютно необходимо.

В вашем случае наилучшим решением является словарь словарей, как уже ответили другие.

1 голос
/ 13 октября 2011

Таким способом можно получить именованные словари, если они являются атрибутами объекта, используя getattr().

class MyClass:
    def __init__(self):
        self.item1dict = {}
        self.item2dict = {}

    def print_all_dicts(self):
        for x in [1,2]:
            print getattr(self, 'item{0}dict'.format(x))

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

...