在函数内部动态创建变量

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)

【讨论】:

以上是关于在函数内部动态创建变量的主要内容,如果未能解决你的问题,请参考以下文章

vue下载文件动态生成的a标签必须带上文件名吗

在函数内部创建2D动态数组

JS动态创建Table,Tr,Td并赋值的具体实现

如何在 React 中动态创建状态?

如何将变量传递给动态创建的 javascript onclick 函数? [关闭]

在 PL/PGSQL 动态 SQL 内部函数中引用局部变量