python 执行

相⽐比 .NET、JAVA 的 CodeDOM 和 Emit,Python 天生拥有无与伦比的动态执行优势。
最简单的就是用 eval() 执行表达式。
>>> eval("(1 + 2) * 3")? ? # 假装看不懂这是啥……
9
>>> eval("{'a': 1, 'b': 2}")? # 将字符串转换为 dict。
{'a': 1, 'b': 2}
eval 默认会使⽤用当前环境的名字空间,当然我们也可以带入自定义字典。
>>> x = 100
>>> eval("x + 200")? ? ? # 使用当前上下文的名字空间。
300
>>> ns = dict(x = 10, y = 20)
>>> eval("x + y", ns)? ? # 使用自定义名字空间。
30
>>> ns.keys()? ? ? ? # 名字空间里多了 __builtins__。
['y', 'x', '__builtins__']
要执⾏行代码⽚片段,或者 PyCodeObject 对象,那么就需要动⽤用 exec 。同样可以带⼊入⾃自定义名字空
间,以避免对当前环境造成污染。
>>> py = """
... class User(object):
22
... def __init__(self, name):
... self.name = name
... def __repr__(self):
... return "".format(id(self), self.name)
... """
>>> ns = dict()
>>> exec py in ns? ? ? # 执⾏行代码⽚片段,使⽤用⾃自定义的名字空间。
>>> ns.keys()? ? ? ? # 可以看到名字空间包含了新的类型:User。
['__builtins__', 'User']
>>> ns["User"]("Tom")? ? # 完全可⽤用。貌似⽤用来开发 ORM 会很简单。

继续看 exec 执⾏行 PyCodeObject 的演⽰示。
>>> py = """
... def incr(x):
... global z
... z += x
... """
>>> code = compile(py, "test", "exec")?? ? # 编译成 PyCodeObject。
>>> ns = dict(z = 100)? ? ? ? ? # ⾃自定义名字空间。
>>> exec code in ns? ? ? ? ? ? # exec 执⾏行以后,名字空间多了 incr。
>>> ns.keys()? ? ? ? ? ? ? # def 的意思是创建⼀一个函数对象。
['__builtins__', 'incr', 'z']
>>> exec "incr(x); print z" in ns, dict(x = 50)? # 试着调⽤用这个 incr,不过这次我们提供⼀一个
150? ? ? ? ? ? ? ? #? local 名字空间,以免污染 global。
>>> ns.keys()? ? ? ? ? ? ? # 污染没有发⽣生。
['__builtins__', 'incr', 'z']
动态执⾏行⼀一个 py ⽂文件,可以考虑⽤用 execfile(),或者 runpy 模块。

你可能感兴趣的:(python 执行)