在函数内部动态创建变量
Posted
技术标签:
【中文标题】在函数内部动态创建变量【英文标题】:Dynamically create variables inside function 【发布时间】:2010-09-12 07:21:47 【问题描述】:我想根据字典在函数内部创建变量。
假设我有一本字典
bar = 'a': 1, 'b': 2, 'c': 3
和功能
def foo():
pass
我想要做的是在函数内部创建“foo”变量,其中每个字典项名称的名称和值作为字典项值
所以最后应该是类似
def foo():
a = 1
b = 2
c = 3
有可能吗?如果是这样,该怎么做?
【问题讨论】:
【参考方案1】:从您的评论来看,您真正想要的可能是一堆对象:
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 攻击,并且很容易引入更严重的安全漏洞。
【讨论】:
【参考方案2】:谢谢大家,我明白了。我不应该做这样的事情。但是,如果你的古玩我试图做的是在 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
【讨论】:
【参考方案3】:你的问题不清楚。
如果您想在 foo 未运行时“设置”所述变量,不,您不能。还没有框架对象可以“设置”局部变量。
如果你想在函数体中这样做,你不应该(检查python documentation for locals())。
但是,您可以执行foo.__dict__.update(bar)
,然后您甚至可以从函数内部以 foo.a、foo.b 和 foo.c 的形式访问这些变量。问题是:你为什么要这样做,为什么没有一个更适合你的课程?
【讨论】:
【参考方案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
(请注意,您的代码必须缩进到同一级别。)
另一方面,如果您想将这些值实际分配给函数 object(因此您可以执行 foo.a 并获得 1 - 请注意,您的示例代码不会执行此操作) ,您可以通过以下方式执行此操作:
for key, val in bar.items():
setattr(foo, key, val)
【讨论】:
以上是关于在函数内部动态创建变量的主要内容,如果未能解决你的问题,请参考以下文章