简洁的Python

2 投票
2 回答
659 浏览
提问于 2025-04-18 05:45

我很喜欢 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

正如我在评论中提到的,evalexec 是不好的选择,推荐使用 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,所以你可能更希望使用一个重载的类,比如在 这个例子 中的那种。

撰写回答