执行字符串表示的函数,并为该函数提供全局变量:
1 #! /usr/bin/env python3 2 3 namespace = {'name': 'zingp', 'data': [16, 19, 25]} 4 5 code = '''def sayHi():return "name %s ,age %d" %(name,data[1],) ''' 6 7 func = compile(code, '<string>', "exec") 8 # print("func>>>:",func) 9 exec(func, namespace) 10 # print(namespace) 11 result = namespace['sayHi']() 12 13 print(result)
运行结果:name zingp ,age 19
上述代码解析:
- 第5行,code是一个字符串,该字符串的内容是一个函数体。
- 第7行,将code字符串编译成函数 sayHi
- 第9行,将函数 sayHi添加到namespace字典中(key为 sayHi),同时也将python的所有内置函数添加到namespace字段中(key为__builtins__),这样,我们print(namespace)会得到以下一个字典:
1 {'sayHi': <function sayHi at 0x02036D20>, 'data': [16, 19, 25], 'name': 'zingp', '__builtins__': {python的所有内置函数...}}
而且namespace字典的中的key,value好比是一个个的全局变量:
1 name = 'zingp' 2 data = [16, 19, 25] 3 def sayHi(): 4 return "name %s ,age %d" % (name,data[1],)
- 第11行,执行sayHi函数并将返回值复制给result
- 第13行,输出result
我了个擦,居然把字符串变成了函数并且还为该函数提供了全局变量,是不是很巧秒。这个功能其实就是python的web框架中模板语言部分至关重要的部分,因为在模板处理过程中,首先会读取html文件,然后分割html文件,再然后讲分割的文件组成一个字符串表示的函数,再再然后就是利用上述方法执行字符串表示的函数。