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

1

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

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

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

и функция

def foo():
  pass

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

Итак, в конце он должен быть похож на

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

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

Теги:

4 ответа

2
Лучший ответ

Ваш вопрос непонятен.

Если вы хотите "установить" указанные переменные, когда foo не работает, нет, вы не можете. Пока нет объекта фрейма, чтобы "установить" локальные переменные.

Если вы хотите сделать это в теле функции, вам не следует (проверьте документацию python для locals()).

Однако вы можете сделать foo.__dict__.update(bar), а затем вы можете получить доступ к этим переменным, даже изнутри функции, как foo.a, foo.b и foo.c. Вопрос в том, почему вы хотите это сделать, и почему класс не подходит для ваших целей?

3

Из вашего комментария, возможно, то, что вы действительно ищете, похоже на объект сгустки:

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') - не используются в вашем случае, но я оставил его для согласованности с обычным использованием)

Для этого требуется "b". префикс для доступа к вашим переменным, но если вы думаете об этом, это не плохо. Подумайте о том, что произойдет, если кто-нибудь создаст запрос POST для перезаписывания переменных, которые вы не собираетесь перезаписывать, - это позволяет легко создавать сбои и атаки DOS и может легко вводить более серьезные уязвимости безопасности.

1

Спасибо, ребята, я понял. Я не должен был этого делать. Но если ваши любопытства я попытался сделать, так это короткое количество строк в моей функции в 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
1

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

(Обратите внимание, что ваш код должен быть отступом до одного уровня.)

С другой стороны, если вы хотите фактически присвоить эти значения функции object (чтобы вы могли сделать foo.a и получить 1 - обратите внимание, что ваш пример кода не делает этого), вы можете сделать это:

for key, val in bar.items():
    setattr(foo, key, val)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню