exec函数

2020年2月4日 / 46次阅读 / Last Modified 2020年2月4日
内置函数

python内置的exec函数,用来执行一段python代码,这段代码以字符串的形式传给exec函数执行。我觉得最酷的地方,是我们可以靠这个函数,来实现自己的脚本或插件接口。

>>> exec('''
... for i in range(10):
...     print(i)
... ''')
0
1
2
3
4
5
6
7
8
9

默认情况下,exec函数在当前的namespace内执行传入的代码:

>>> a = 123
>>> exec('''
... print(a)
... ''')
123

exec函数的第2个参数,可以用来控制exec内执行代码可以访问的全局变量资源。这是一个dict类型的数据。有些时候,我们直接将globals()函数的返回传给exec函数,让其执行的代码可以访问程序的全部全局资源。

exec('''
print(a)
print(b)
print(d)
c = 3
print(c)''', {'a':111,'b':222,'d':444})

a,b和d通过globals参数传入exec内部代码的执行空间,3个print都可以正常执行。一旦globals参数有赋值,exec内部代码就只能访问这些传入的全局变量,凡是不在globals中存在的其它的程序全局变量,都不可访问。用globals参数,我们可以控制exec内部代码的执行环境,即除了python标准的接口,还可以访问的其它特别的接口。

b = 2
exec('''
print(a)
print(b)
print(d)
c = 3
print(c)''', {'a':111,'d':444})

这段代码,虽然b也是全局,但是没有传入exec执行空间,因此不能被访问:

E:\py>python exec.py
111
Traceback (most recent call last):
  File "exec.py", line 8, in <module>
    print(c)''', {'a':111,'d':444})
  File "<string>", line 3, in <module>
NameError: name 'b' is not defined

exec执行的代码,不能修改程序真正的全局变量,就像一个沙盒一样。exec内执行的代码,也不能有return和yield语句。exec函数的返回永远是None。

没搞得很清楚exec函数的第3个参数,locals到底是什么意思,感觉用不用差别不大,都是向exec的执行空间传递可访问的参数。

exec('''
print(a)
print(b)
print(c)''', {'a':111,'b':222,'d':444}, {'c':333})

3个print都能正确执行。python官方有一段关于globals和locals这两个参数的说明:

In all cases, if the optional parts are omitted, the code is executed in the current scope. If only globals is provided, it must be a dictionary (and not a subclass of dictionary), which will be used for both the global and the local variables. If globals and locals are given, they are used for the global and local variables, respectively. If provided, locals can be any mapping object. Remember that at module level, globals and locals are the same dictionary. If exec gets two separate objects as globals and locals, the code will be executed as if it were embedded in a class definition.

exec接收的代码如果来自一个独立的文件,这就是一个简易的插件系统!

-- EOF --

本文链接:https://www.pynote.net/archives/1789

留言区

《exec函数》有2条留言

电子邮件地址不会被公开。 必填项已用*标注

  • 麦新杰

    当exec中执行的代码含有函数定义并有这些函数的调用时,globals参数就很有用了。 [回复]

  • 麦新杰

    如果不使用globals参数,exec的执行就是在current scope [回复]


前一篇:
后一篇:

More


©Copyright 麦新杰 Since 2019 Python笔记

go to top