python execfile()和locals()函数

今天看别人写的Python代码,看到两个函数:execfile()和locals()。第一感觉还以为是作者自定义的两个函数,把鼠标分别移到对应的两个函数上,竟然显示是python的built-in函数。感到大吃一惊,自己竟然不知道Python这两个内建函数,于是要把这个built-in函数好好分析一下究竟是干啥用的。下面代码是我见到的execfile()和locals()函数的使用。

execfile(rc) # rc is a file
l = locals()

execfile()

从Python的官方文档中找到execfile()的介绍,该函数类似于exec语句,但是参数为一个文件,并不是exec的字符串。此外,它与import语句的区别在于它并不使用模块管理(module administration),该文件被无条件地读取并不会创建一个新的模块。

该函数的参数是一个文件名以及两个可选的字典。该文件作为一个Python语句被解析并评估,根据全局和局部空间,该条语句使用全局和局部字典。如果提供这两个参数,locals可以为任何映射的对象。需要注意的是在模块级别,globals和locals是相同的字典。如果两个独立的对象作为globals和locals出入,改代码会被执行好像被嵌入到了类的定义中。

如果locals字典被忽略将会默认用globals字典。如果两个字典都忽略,表达式在execfile()函数被调用的环境下被执行,返回值为None。

locals()

再来看locals()函数的定义,该函数更新并返回一个字典来表达当前的局部符号表(local symbol table)。但该函数在函数块中被调用,而不是在类块中被调用,将会返回一个自由变量(free variables)。

我们先来看一下上述代码中locals()的返回值。

{'parameters': ('syntax', 'syntax_spec', 'huffman_path', 'version'), 'l': {...}, 'syntax_spec': '../syntax', 'huffman_path': None, '_get': <function _get at 0x00000000025A1C88>, 'version': 'BSDL2py 0.2.0.0', 'rc': 'C:\\f\\depot\\licensing\\common\\oamdi\\main\\oamdi\\internal\\bam\\script\\.bsdlrc', 'syntax': 'object_audio_metadata_payload'}
我们再来看一下通过cmd进入Python后的一些值。

C:\Users\xzfeng>python
Python 2.7.3 (default, Apr 10 2012, 23:24:47) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> locals()
{'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__doc__': None, '__package__': None}
>>> globals()
{'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__doc__': None, '__package__': None}
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__']
dir()函数返回在代码中这一点的有效的命名空间。它主要应用在交互式解释器中,但是也可以用在代码中。它返回一个字符串的列表,每个字符串都是有某个值的变量。

关于symbol table,可以查看 该篇文章,介绍的很详细。

此外本文也参考了stackoverflow的一篇帖子,这是链接。

你可能感兴趣的:(python execfile()和locals()函数)