2014-05-07 49 views
2

我喜歡Literate CoffeeScript的想法,並想知道我是否可以使用Python進行一些工作。我試圖完成類似於這個簡單的Literate Ruby的事情,最終得到以下結果。該程序在標準輸入,文件或文件列表中使用Literate Python,並只執行代碼。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,想知道我是否遺漏了一些東西,或者是否有更好的解決方案。

+0

'exec'就像'eval'是邪惡的! – zmo

+4

@zmo這實際上是'exec'完全合法的用例。 –

+1

這個問題確實屬於[代碼評論](http://codereview.stackexchange.com/),因爲它是有效的代碼,你在問一些總體的改進。 –

回答

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的結果,所以你可能要改爲使用重載類,如一個在this example

+4

'代碼'本質上不是天生的或多或少的邪惡,然後'exec'或'eval' - [它只是一個包裝它們](http://hg.python.org/cpython/file/219502cf57eb/Lib/code.py )。這絕對是一個更好的方法,但是在這裏調用'eval' /'exec'邪惡是錯誤的 - 它們只在你不想執行任意代碼的地方是邪惡的。 –

2

梳理python和markdown-like語法最好使用工具來完成,而不是改變語言。例如:

  • 斯芬克斯(從文檔字符串或其它文件重組文本渲染輸出,這兩者可以具有嵌入代碼樣本)
  • IPython的筆記本(「小區」與任一降價或Python代碼的組合)