如何使列表的子项成为python中的变量

时间:2011-05-03 10:00:57

标签: python metaprogramming external-process couchapp

我正在尝试使用couchdb和couchapp制作网页...
但由于某种原因,我需要使用python进行外部处理。
现在我陷入了如何处理python中的post变量...

我看了this(它有效)和this ...

但我想这样:

>>> a = {"success":1,"data":{"var1":1,"var2":2,"var3":3}}
>>> a["data"]["var2"]
2
>>> var2

Traceback (most recent call last):
  File "<pyshell#2>", line 1, in <module>
    var2
NameError: name 'var2' is not defined
>>> for key, value in a["data"].items():
    print  (key, value)
('var1', 1)
('var3', 3)
('var2', 2)
>>> var1

Traceback (most recent call last):
  File "<pyshell#6>", line 1, in <module>
    var1
NameError: name 'var1' is not defined
>>> 

我想,当我输入var2时,它返回2
换句话说,当我不知道数据len多少时,如何使嵌套的子对象成为变量..这是因为在外部python中,如何处理post变量就像这样req["form"]["var1"]

3 个答案:

答案 0 :(得分:4)

您应该尝试使用数据字典更新本地(不推荐)或全局词典

>>> a = {"success":1,"data":{"var1":1,"var2":2,"var3":3}}
>>> a["data"]["var2"]
2
>>> locals().update(a["data"])
>>> var2
2

>>> globals().update(a["data"])
>>> var2
2

要以安全的方式执行此操作,您必须信任您正在更新全局字典的数据来源,以避免内置替换或其他有趣的代码注入。

答案 1 :(得分:2)

可以使用python“exec”语句构建一个字符串,然后动态执行它。

a = {"success":1,"data":{"var1":1,"var2":2,"var3":3}}

for key, value in a["data"].items():
    exec('%s=%s' % (key, value, ))

print 'var1:', var1
print 'var2:', var2
print 'var3:', var3

答案 2 :(得分:1)

为了安全地做到这一点,我建议像:

allowed_variables = ('var1', 'var2', 'var3')

for k,v in a["data"].iteritems():
    if k in allowed_variables:
        locals.update({k:v})