在函数内动态创建变量

时间:2008-09-23 08:55:25

标签: python

我想在字典中创建函数内的变量。

让我说我有一本字典

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

和功能

def foo():
  pass

我想要做的是创建内部函数“foo”变量,其中每个字典项名称的名称和值作为字典项值

所以最后它应该类似于

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

有可能吗?如果确实如此,该怎么做?

4 个答案:

答案 0 :(得分: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攻击变得容易,并且很容易引入更严重的安全漏洞。 / p>

答案 1 :(得分:2)

你的问题不明确。

如果你想在foo没有运行时“设置”所说的变量,不行,你不能。没有框架对象尚未“设置”局部变量。

如果你想在功能体中这样做,你不应该(检查python documentation的本地人())。

但是,可以执行foo.__dict__.update(bar),然后您甚至可以从函数内部访问这些变量,如foo.a,foo.b和foo.c.问题是:你为什么要这样做,为什么不是一个更适合你的目的的课程呢?

答案 2 :(得分: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

(请注意,您的代码必须缩进到同一级别。)

另一方面,如果你想将这些值实际分配给函数对象(所以你可以做foo.a并获得1 - 请注意你的示例代码不会这样做) ,你可以这样做:

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

答案 3 :(得分: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