python exec() 函数详解(转)

我们都知道 exec 函数可以用来动态执行 python 代码:

1

2

3

>> exec('foobar = 123')

>>> foobar

123

那么大家是否知道 exec 函数还支持两个可选参数呢(不支持通过关键字去指定参数)? :

1

exec(object[, globals[, locals]])

这两个参数可以用来指定执行代码时可以使用的全局变量和局部变量, 以及收集执行代码后的全局变量和局部变量。

  • globals 默认为 globals()
  • locals 默认为 globals 参数的值

下面将举例说明指定 globals 和 locals 时的效果。

globals

globals 是个 dict 对象,用来指定代码执行时可以使用的全局变量以及收集代码执行后的全局变量:

1

2

3

4

5

6

7

8

9

10

11

12

13

>>> age = 10

>>> exec('abc = age + 1')

>>> exec('abc = age + 1', {})

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

File "<string>", line 1, in <module>

NameError: name 'age' is not defined

>>> exec('abc = age + 1', {'age': 2})

>>>

>>> g = {'age': 2}

>>> exec('abc = age + 1', g)

>>> g['abc'], g['age']

(3, 2)

如果只指定了 globals 参数,它的值将同样用于 locals 参数。

有一点需要注意的是: 当 globals 字典不包含 __builtins__ 这个 key 时, python 会自动加一个指向 builtins 的引用。所以如果要禁止/限制代码使用内置函数的话, 需要同时指定 __builtins__ 这个 key:

1

2

3

4

5

6

7

>>> exec('int(1)', {})

>>> exec('int(1)', {'__builtins__': {}})

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

File "<string>", line 1, in <module>

NameError: name 'int' is not defined

locals

locals 可以是任何 mapping 对象,用来指定代码执行时的局部变量以及收集代码执行后的局部变量:

1

2

3

4

5

6

7

8

9

10

>>> exec('abc = age + 1', {}, {'age': 2})

>>>

>>> local = {}

>>> exec('''

... name = 'Tom'

... age = 13

... ''', {}, local)

>>> local

{'age': 13, 'name': 'Tom'}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值