Создание или назначение переменных из словаря в Python

Я пытался задать вопрос обычно один раз здесь, но никто не понимает, что я хочу спросить. Итак, я нашел пример в PHP.

// $_POST = array('address' => '123', 'name' => 'John Doe');
extract($_POST);
echo $address;
echo $name

есть функция, подобная extract() в PYTHON?????

То же самое касается словаря:

mydict = {'raw':'data', 'code': 500}
// some magic to extract raw and code as vars
print raw 

p.s. почему я хочу это сделать: когда вы находитесь в методе класса, чертовски трудно иметь 6 манипуляций со строками в join() и format(), когда строка self.data ['raw'] ['code'] (предположим здесь он диктует здесь)

Ответы

Ответ 1

ОК, братья php, поэтому здесь плохая новость, python не может создавать переменные из пространства... например php can: ${$ var}. Использовать local() - очень плохая идея, потому что у вас будет много проблем с отладкой, и там есть некоторые локали, которые уже определены там.. так что это действительно плохо...

Вы не можете создать это программно, как php. Я думаю, что это называется un-explicity, и это один общий python: вы ВСЕГДА знаете имя переменной. В некоторых случаях это просто самоубийство, вам нужно написать вручную тонны варов... В основном я был недоволен из-за таких вещей, как разбор XML, но похоже, что есть способ преобразования словаря python в класс, я было сказано об этом вчера, но все еще не проверили, как это работает (что-то вроде здесь)

Ответ 2

Вы можете использовать функцию locals() для доступа к таблице локальных символов и обновления этой таблицы:

>>> mydict = {'raw': 'data', 'code': 500}
>>> locals().update(mydict)
>>> raw
'data'
>>> code
500

Изменение таблицы символов в этом случае довольно необычно, и, вероятно, не путь. Возможно, вам нужно изменить свой дизайн, чтобы вместо словарных переменных использовать словарь mydict.

Ответ 3

Ужасно поздно в игре, но мне нужно было именно это, и мое решение было:

mydict = {'raw':'data', 'code': 500}
raw, code = [mydict.get(k) for k in ['raw','code']]

Таким образом, он явный для чтения и нет потенциального сбивания locals() (что является магии, которую я бы предпочел избежать).

Ответ 4

Я рекомендую создать класс для хранения переменных, которые вы пытаетесь создать. Alex Martelli, известный рецепт куча, предоставит вам почти все удобства, о которых вы просите, не прибегая к изменению локальной таблицы символов (которая docs специально предупреждают об этом).

Ответ 5

Здесь нет ничего нового, просто консолидация одного anwser и иллюстрация того, что @John Y означало в его ответе:

mydict = {'raw': 'data', 'code': 500}

def extract(dct, namespace=None):
    if not namespace: namespace = globals()
    namespace.update(dct)

extract(mydict)
print raw
print code

class Extract:
    def __init__(self, dct):
        self.__dict__.update(dct)

obj = Extract(mydict)
print obj.raw
print obj.code

Ответ 6

Вы также можете использовать ключевое слово exec в цикле.

d = dict(param='hello', param2=500, param3=[1,2,3])
for k, v in d.iteritems():
    exec '%s = v' % k

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

Ответ 7

Я попробовал ответить @Frédéric Hamidi и обнаружил, что locals() работает только в основном script и НЕ работает ни в каких функциях. Поэтому я немного искал и узнал, что locals() ТОЛЬКО ЧИТАЕМ. Причина, по которой он работает в основном script, вероятно, является причиной того, что locals() совпадает с globals() там, и globals() может быть изменен.

Поэтому я бы предложил использовать globals(). update() вместо этого.

Но он будет загрязнять ваше глобальное пространство имен. Таким образом, этот трюк еще менее чист, чем локальные().