Создание или назначение переменных из словаря в 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() вместо этого.
Но он будет загрязнять ваше глобальное пространство имен. Таким образом, этот трюк еще менее чист, чем локальные().