2015-09-09 90 views
0

有人能解释一下这段代码的工作原理吗?解释当地人()以及它究竟是如何工作的

info = {} 
info.update(locals()) 
info.pop('self', None) 
info.pop('info', None) 

我假设,并请纠正我,如果我错了,但它可以让所有的变量在当前函数,并把他们的字典,并删除自身,并得到了放在字典,对吗?除了自我之外,还有别的什么,我可能不想进入那里?

只有JSON序列化该字典并发布它会有什么问题吗?

+0

取决于什么是在那里......也许你可以序列化它,只要所有的项目都可以序列化 –

回答

3

这可能来自Django template and the locals trick。这个想法是在函数内部填充一些变量,并使用locals()将它们传递给模板。它节省了用所有这些变量创建一个新字典的努力。

具体而言,您的代码将创建一个包含所有局部变量的字典,并删除self(类对象参数)和info(刚创建的变量)。所有其他本地变量都会返回。

只要数据可以被序列化,您就可以JSON序列化数据。例如,DateTime变量必须首先转换为字符串。

+0

好的,谢谢你一堆 – electrometro

0

该代码创建一个名为'info'的新字典,并将它的所有本地python变量赋值给它。注意:这些是指向本地环境中相同对象的指针,因此如果您修改了info中的列表或字典,它也会在您的环境中更改(这可能是也可能不是所需的行为)。

locals() 更新,并返回来表示当前本地 符号表的字典。当函数块调用 时,自由变量由locals()返回,但不在类块中调用。

注意:本词典的内容不应修改; 的更改可能不会影响解释器使用的本地和自由变量的值。

info.pop('self', None)info.pop('info', None)将您的新info词典中删除 '自我' 和 '信息',分别。如果他们不在场,他们会返回None。请注意,如果'self'不在字典中,info.pop('self')将返回一个KeyError。

+0

请注意,改变返回的字典里面的变量不会影响存在于环境中,它只在更改对象的内容时才起作用,直接在字典中重新分配int应该在字典之外没有任何效果。 – zstewart

+0

如果您重新分配变量,那么这不是问题。如果你修改一个列表或字典,那就是了。我编辑了我的回复以澄清。 – Alexander

相关问题