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 "<User: {0:x}; name={1}>".format(id(self), self.name)
... """
>>> ns = dict()
>>> exec py in ns? ? ? # 执⾏行代码⽚片段,使⽤用⾃自定义的名字空间。
>>> ns.keys()? ? ? ? # 可以看到名字空间包含了新的类型:User。
['__builtins__', 'User']
>>> ns["User"]("Tom")? ? # 完全可⽤用。貌似⽤用来开发 ORM 会很简单。
<User: 10547f290; name=Tom>
继续看 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 模块。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值