【问题标题】: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

有可能吗?如果是这样,该怎么做?

【问题讨论】:

    标签: python


    【解决方案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)
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-09-17
            • 2021-03-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-12-10
            相关资源
            最近更新 更多