Динамически создавать переменные внутри функции

Я хочу создать переменные внутри функции из словаря.

Допустим, у меня есть словарь

bar = {'a': 1, 'b': 2, 'c': 3}

и функция

def foo():
  pass

Что я хочу сделать, так это создать внутри функции переменные "foo" с именами каждого имени элемента словаря и значений в качестве значений элемента словаря.

Так что в итоге это должно быть похоже на

def foo():
  a = 1
  b = 2
  c = 3

Это вообще возможно? И если да, то как это сделать?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
1 407
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Зачем вам это нужно? Если вы на самом деле ничего не сделаете с переменными внутри функции, функция, которая просто назначает несколько переменных, а затем отбрасывает их, неотличима от 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-атак и может легко внести более серьезные уязвимости в системе безопасности.

Другие вопросы по теме