简洁的Python
我很喜欢 Literate CoffeeScript 这个想法,想看看能不能用Python实现类似的功能。我尝试做一个和这个简单的 Literate Ruby 类似的东西,最后得到了下面的结果。这个程序可以从标准输入、一个文件或多个文件中读取Literate Python代码,并只执行代码部分。
import fileinput
import re
code = ''
for line in fileinput.input():
match = re.match(r'([ ]{4}|\t)(.*)', line)
if match:
code += match.group(2) + '\n'
exec code
这是一个简单的Literate Python文件。
# Python Hello World Program
A simple example of a Literate Python Hello Word program.
print "hello world"
我刚接触Python,想知道我是不是漏掉了什么,或者有没有更好的解决方案。
2 个回答
2
把Python和类似Markdown的语法结合起来,最好的方法是使用工具,而不是去改变语言本身。比如:
- sphinx(可以从文档字符串或其他文件中的重构文本生成输出,这些文件里可能嵌入了代码示例)
- ipython notebook(将“单元格”结合起来,可以是Markdown格式或Python代码)
2
正如我在评论中提到的,eval
或 exec
是不好的选择,推荐使用 code 模块,下面的例子就展示了这一点。此外,你可能会想先编译正则表达式,这样在每次处理输入时只需要进行匹配,而不是每次都重新构建自动机。
import fileinput
import code
console = code.InteractiveConsole(locals())
import re
r = re.compile(r'([ ]{4}|\t)(.*)')
code = ''
for line in fileinput.input():
match = r.match(line)
if match:
console.push(match.group(2))
不过,这个例子会把结果输出到 sys.stdout
,所以你可能更希望使用一个重载的类,比如在 这个例子 中的那种。