我想在字典中创建函数内的变量。
让我说我有一本字典
bar = {'a': 1, 'b': 2, 'c': 3}
和功能
def foo():
pass
我想要做的是创建内部函数“foo”变量,其中每个字典项名称的名称和值作为字典项值
所以最后它应该类似于
def foo():
a = 1
b = 2
c = 3
有可能吗?如果确实如此,该怎么做?
答案 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