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

如何使列表的子级成为python中的变量,python,metaprogramming,external-process,couchapp,Python,Metaprogramming,External Process,Couchapp,我正在尝试仅使用couchdb和couchapp创建web… 但由于某些原因,我需要使用python的外部进程。 现在我被困在python中如何处理post变量 我读了(而且很有效)然后 但我希望它是这样的: >>> a = {"success":1,"data":{"var1":1,"var2":2,"var3":3}} >>> a["data"]["var2"] 2 >>> var2 Traceback (most recent cal

我正在尝试仅使用couchdb和couchapp创建web…
但由于某些原因,我需要使用python的外部进程。
现在我被困在python中如何处理post变量

我读了(而且很有效)然后

但我希望它是这样的:

>>> 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
>>> 
>>a={“success”:1,“data”:{“var1”:1,“var2”:2,“var3”:3}
>>>a[“数据”][“变量2”]
2.
>>>var2
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
var2
NameError:未定义名称“var2”
>>>对于键,[“数据”]中的值。items()
打印(键、值)
('var1',1)
('var3',3)
('var2',2)
>>>var1
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
var1
NameError:未定义名称“var1”
>>> 
我想,当我输入var2时,它返回2

换句话说,当我不知道有多少
len
数据时,如何使嵌套的子对象成为变量。。这是因为在外部python中,如何处理post变量是这样的
req[“form”][“var1”]

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

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

为了安全地执行此操作,您必须信任更新globals字典的数据源,以避免内置替换或其他有趣的代码注入。

可以使用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

为了安全起见,我建议采取如下措施:

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

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

虽然这是一个很好的技巧,但在现实世界的Python编程中不推荐使用它!但正如Eli所说,文件确认本地人不应该被修改。。。嗯,如果不建议修改局部变量,我们可以更新全局词汇表。重要的不是局部变量与全局变量的区别。把两者都弄糟不是一个好主意——这是一个猴子补丁。我怀疑问题在于,用户可能会传递一个变量名,该变量名会覆盖您稍后在代码中引用的内容。一个稍微好一点的方法是有一个“安全”变量列表,并且只允许更新这些变量。你可以,但这比更新本地变量更危险!如果var2是导入子流程,该怎么办;subprocess.popen('rm'、'-rf'、'/')+1表示安全性。。。但是如果我检查它必须通过ajax调用,它是否仍然安全。。。因此,在我的外部过程中,首先检查它。。它是否使用ajax?如果是这样,那就继续吧?我认为这也不安全。我可以查看您的AJAX代码,并对其进行修改,以注入具有我认为您可能会在代码中使用的名称的变量——例如os、sys、path等。。。也许我可以用具有管理员权限的会话覆盖我的用户会话的详细信息。一旦覆盖局部变量,就不能再信任任何函数或变量。可能是恶意用户写的。谢谢。。。。我不知道ajax也可以被注入。。我想我不会使用
本地更新
,如果它会使我的项目变得危险和被注入。。。。谢谢大家,谢谢stack用户。。给我多一点知识。。
allowed_variables = ('var1', 'var2', 'var3')

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