builtin-compile-example.py

# -*- coding: utf-8 -*-

# @File    : builtin-compile-example.py
# @Date    : 2018-09-20
# @Author  : Peng Shiyu

# eval 函数只针对简单的表达式.
# 如果要处理大块的代码, 你应该使用compile和exec 函数

name = "script.py"
script = "name = 'Tom'; age = 23; print(name, age)"

# 编译脚本, 返回一个代码对象
code = compile(script, name, "exec")

# 执行脚本  py2
# exec code
# ('Tom', 23)

import string

class CodeGeneratorBackend(object):
    """
    在程序执行时实时地生成代码.
    write 方法用于添加代码,
    indent 和dedent 方法用于控制缩进结构.
    其他部分交给类来处理.
    """

    def begin(self, tab="\t"):
        self.code = []
        self.tab = tab
        self.level = 0

    def end(self):
        self.code.append("")  # 确保最后一行是空行
        return compile(string.join(self.code, "\n"), "<code>", "exec")

    def write(self, code):
        self.code.append(self.tab * self.level + code)

    def indent(self):
        self.level += 1

    def dedent(self):
        if self.level == 0:
            raise SyntaxError("缩进小于0")
        else:
            self.level -= 1

c = CodeGeneratorBackend()
c.begin()
c.write("for i in range(3):")
c.indent()
c.write("print('i = ', i)")
c.dedent()
# exec c.end()
"""
('i = ', 0)
('i = ', 1)
('i = ', 2)
"""

# execfile 函数, 一个从文件加载代码, 编译代码, 执行代码的快捷方式

# execfile("hello.py")
# hello world!