Я хочу создать переменные внутри функции из словаря.
Допустим, у меня есть словарь
bar = {'a': 1, 'b': 2, 'c': 3}
и функция
def foo():
pass
Что я хочу сделать, так это создать внутри функции переменные "foo" с именами каждого имени элемента словаря и значений в качестве значений элемента словаря.
Так что в итоге это должно быть похоже на
def foo():
a = 1
b = 2
c = 3
Это вообще возможно? И если да, то как это сделать?






Зачем вам это нужно? Если вы на самом деле ничего не сделаете с переменными внутри функции, функция, которая просто назначает несколько переменных, а затем отбрасывает их, неотличима от def foo (): pass (оптимизатор будет оправдан в создании точно такого же байт-кода).
Если вы также хотите динамически добавлять код, который использует значения, вы можете сделать это с помощью exec (хотя, если это действительно код, вводимый пользователем, почти наверняка есть лучшие способы сделать то, что вы хотите). например:
some_code = ' return a+b+c'
exec "def foo():\n " + '\n '.join('%s = %s' for k,v in bar.items()) + '\n' + some_code
(Обратите внимание, что ваш код должен иметь такой же отступ.)
С другой стороны, если вы действительно хотите присвоить эти значения функции объект (чтобы вы могли выполнить foo.a и получить 1 - обратите внимание, что ваш пример кода этого не делает), вы можете сделать это следующим образом:
for key, val in bar.items():
setattr(foo, key, val)
Ваш вопрос непонятен.
Если вы хотите «установить» указанные переменные, когда foo не запущен, нет, вы не можете. Еще нет фрейм-объекта, в который можно "установить" локальные переменные.
Если вы хотите сделать это в теле функции, не следует (проверьте документация python для locals ()).
Однако вы мог выполняете foo.__dict__.update(bar), и тогда вы можете получить доступ к этим переменным даже изнутри функции как foo.a, foo.b и foo.c. Возникает вопрос: почему вы хотите это сделать и почему класс не подходит больше для ваших целей?
Спасибо, ребята, я понял. Я не должен этого делать. Но если вам интересно, что я пытался сделать, это как-то сократить количество строк в моей функции просмотра в django. У меня есть форма со многими полями, и вместо того, чтобы получать каждое поле в виде:
first_name = form.cleaned_data['first_name']
last_name = form.cleaned_data['last_name'] ..
Я думал взять каждое имя атрибута моего класса формы и перебрать его. Вот так:
for name in ProfileRegistration.base_fields.__dict__['keyOrder']:
# and here the variables that i tried to assign
Из вашего комментария, возможно, вы действительно ищете что-то вроде связки объекта:
class Bunch(object):
def __init__(self, **kwargs):
self.__dict__.update(kwargs)
b=Bunch(**form.cleaned_data)
print b.first_name, b.last_name
(Синтаксис ** обусловлен тем, что объекты типа Bunch обычно используются как Bunch (foo = 12, bar = 'blah') - в вашем случае не используется, но я оставил его для согласованности с обычным использованием)
Это действительно требует «б». префикс для доступа к вашим переменным, но если подумать, это неплохо. Подумайте, что произойдет, если кто-то создаст запрос POST для перезаписи переменных, которые вы не ожидаете перезаписать - это упрощает создание сбоев и DOS-атак и может легко внести более серьезные уязвимости в системе безопасности.