Создание или назначение переменных из словаря в Python - PullRequest
15 голосов
/ 05 декабря 2010

Я однажды пытался задать вопрос, но никто не понимает, что я хочу спросить. Итак, я нашел пример в 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 (), когда string - self.data ['raw'] ['code'] (предположим здесь все в порядке)

Ответы [ 7 ]

25 голосов
/ 05 декабря 2010

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

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

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

10 голосов
/ 28 февраля 2013

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

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

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

4 голосов
/ 17 декабря 2010

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

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

1 голос
/ 05 декабря 2010

Здесь нет ничего действительно нового, только объединение одного ответа и иллюстрация того, что @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
1 голос
/ 05 декабря 2010

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

0 голосов
/ 19 августа 2014

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

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

0 голосов
/ 25 марта 2013

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

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

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

...