有一个非常好的python模块形式的解决方案,cogapp模块。
这是一个例子macro_test.py:
#define english { 1: "first",2:"second"}
#define roman { i:"first",ii:"second" }
#[[[cog
# import cog
# english = { 1 : "first", 2 : "second" }
# roman = { "i" : "first", "ii" : "second" }
# cog.outl("mylist = [ {0!r}, {1!r} ]".format(english, roman))
#
# ## something actually usefull:
# import os
# git_command = "git log --pretty=format:'%H' -n 1"
# release_git_version = os.popen(git_command).read()
# ## Note how release_git_version string contains quote char at start and at the end
# cog.outl("release_git_version = {}".format(release_git_version))
#]]]
#[[[end]]]
print("mylist = {}".format(mylist))
print("release_git_version = {}".format(release_git_version))
然后你像这样运行预处理器:
python -m cogapp -r macro_test.py
并且由于-r 选项macro_test.py 源被重写为:
#define english { 1: "first",2:"second"}
#define roman { i:"first",ii:"second" }
#[[[cog
# import cog
# english = { 1 : "first", 2 : "second" }
# roman = { "i" : "first", "ii" : "second" }
# cog.outl("mylist = [ {0!r}, {1!r} ]".format(english, roman))
#
# ## something actually usefull:
# import os
# git_command = "git log --pretty=format:'%H' -n 1"
# release_git_version = os.popen(git_command).read()
# ## Note how release_git_version string contains quote char at start and at the end
# cog.outl("release_git_version = {}".format(release_git_version))
#]]]
mylist = [ {1: 'first', 2: 'second'}, {'i': 'first', 'ii': 'second'} ]
release_git_version = '340b5c2f85c7070f236161d14db07a74ab9abdcb'
#[[[end]]]
print("mylist = {}".format(mylist))
print("release_git_version = {}".format(release_git_version))
对于代码生成非常有用。现在,当您运行 macro_test.py 脚本时,会有正确的输出:
>python macro_test.py
mylist = [{1: 'first', 2: 'second'}, {'i': 'first', 'ii': 'second'}]
release_git_version = 340b5c2f85c7070f236161d14db07a74ab9abdcb
我添加了release_git_version 代码位以显示有用性,因为其他答案试图将此问题视为无稽之谈。
请注意,生成这样的代码并不是优化性能的正确方法。 Python 解释器仍然需要解析生成的代码。如果您使用的是 CPython,那么优化通常通过在 C/C++ 中重新实现瓶颈代码来实现。
cogapp 也适用于其他语言、XML 或 JSON 的代码。更多详情here。