2017-10-07 47 views
2
#template.py 

import fileinput, re 

field_pat = re.compile(r'\[(.+?)\]') 

scope = {} 

def replacement(match): 
    code = match.group(1) 
    try: 
     return str(eval(code, scope)) 
    except SyntaxError: 
     exec code in scope 
     return 

lines = [] 
for line in fileinput.input(): 
    lines.append(line) 
text = ''.join(lines) 

print field_pat.sub(replacement, text) 

#text.py 

[x = 1] 
[y = 2] 
The sum of [x] and [y] is [x + y] 

如果我在命令行中執行「蟒蛇template.py text.py」,如果將打印「1總和2是3'。在文件template.py中,replacement()是一個函數,爲什麼它是sub()函數的參數,並且它沒有參數?(它應該將一個匹配對象作爲參數)另外,什麼是範圍字典如果它是空的? 非常感謝!我不太理解這個模板函數在Python

+0

pat_field.sub()中的替換函數確實有參數。它被稱爲「文本」。 –

+0

感謝您的回覆!是的,我瞭解替換這裏用作一個字符串,並且該函數返回一個字符串。但是,如果函數沒有將匹配對象作爲參數,它如何返回一個字符串? –

回答

4

所以你問幾個關於這段代碼的問題。它是什麼打算這樣做是很清楚的:它的目的是

  1. 讀取輸入文件,
  2. 合併成一條線,
  3. 對於在該行發現方括號每個表達式
  4. 請致電eval(code,scope),其中code是括號內的表達式。

現在爲您的具體問題:

  1. 更換()是一個函數,爲什麼它是子()函數的參數,它沒有說法?

因爲那是多麼sub() function工作

重。 (圖案,REPL,串,計數= 0,標誌= 0)

返回由替換 REPL替換圖案的最左邊的非重疊出現所獲得的字符串。如果未找到該模式,則字符串將返回不變。 repl 可以是字符串或函數; [...] 如果repl是一個函數,它會調用每個非重疊的 出現的模式。該函數採用單個匹配對象 參數,並返回替換字符串。

這裏的模式是self的參數,而repl設置爲我們的replacement()函數。它將接收匹配對象作爲參數,該參數包含對每個匹配組的引用。

  1. 而且,如果它是空的範圍字典是什麼?

這是將用於跟蹤變量賦值的字典。它將作爲第二個參數提供給eval()

爲了說明這裏是replacement()函數的執行軌跡。該功能正好執行5次。

Evaluating 'x = 1', scope = [] 
Evaluating 'y = 2', scope = ['x : 1'] 
Evaluating 'x', scope = ['x : 1', 'y : 2'] 
Evaluating 'y', scope = ['x : 1', 'y : 2'] 
Evaluating 'x + y', scope = ['x : 1', 'y : 2'] 
+0

感謝您的回答!這非常有幫助! –