Конвертировать словарные записи в переменные - python

Существует ли питонический способ присвоения значений словаря его ключам, чтобы преобразовать словарные словарные записи в переменные? Я пробовал это:

>>> d = {'a':1, 'b':2}
>>> for key,val in d.items():
        exec('exec(key)=val')

        exec(key)=val
                 ^ 
        SyntaxError: invalid syntax

UPDATE: Возможно, я должен был быть более конкретным: я действительно уверен, что пары ключ-значение верны, потому что раньше они были определены как переменные. Затем я сохранил эти переменные в словаре (как пары ключ-значение) и хотел бы повторно использовать их в другой функции. Я мог бы просто определить их снова в новой функции, но поскольку у меня может быть словарь с примерно 20 записями, я думал, что может быть более эффективный способ сделать это.

Ответ 1

Это то, что я искал:

>>> d = {'a':1, 'b':2}
>>> for key,val in d.items():
        exec(key + '=val')

Ответ 2

Вы можете сделать это в одной строке с помощью:

>>> d = {'a': 1, 'b': 2}
>>> locals().update(d)
>>> a
1

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

Примечание

Я думаю, что редактирование locals(), как это вообще плохая идея. Если вы думаете, что globals() - лучшая альтернатива, подумайте дважды!: -D

Вместо этого я бы предпочел всегда использовать пространство имен.

С Python 3 вы можете:

>>> from types import SimpleNamespace    
>>> d = {'a': 1, 'b': 2}
>>> n = SimpleNamespace(**d)
>>> n.a
1

Если вы застряли в Python 2 или вам нужно использовать некоторые функции, отсутствующие в types.SimpleNamespace, вы также можете:

>>> from argparse import Namespace    
>>> d = {'a': 1, 'b': 2}
>>> n = Namespace(**d)
>>> n.a
1

Если вы не собираетесь изменять свои данные, вы можете также рассмотреть возможность использования collections.namedtuple, также доступного в Python 3.

Ответ 3

У вас уже есть отличный словарь. Просто используйте это. Если вы знаете, какие ключи будут, и вы абсолютно уверены, что это разумная идея, вы можете сделать что-то вроде

a, b = d['a'], d['b']

но большую часть времени вы должны просто использовать словарь. (Если использование словаря неудобно, вы, вероятно, не организуете свои данные, попросите его реорганизовать его.)

Ответ 4

Рассмотрим решение "Bunch" в Python: загрузите переменные в dict в пространство имен. Ваши переменные заканчиваются как часть нового объекта, а не как локальные, но вы можете рассматривать их как переменные вместо записей dict.

class Bunch(object):
    def __init__(self, adict):
        self.__dict__.update(adict)

d = {'a':1, 'b':2}
vars = Bunch(d)
print vars.a, vars.b

Ответ 5

Используйте pandas:

import pandas as pd
var=pd.Series({'a':1, 'b':2})
#update both keys and variables
var.a=3
print(var.a,var['a'])