簡體   English   中英

我不太了解Python中的此模板功能

[英]I don't quite understand this template function in Python

#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]

如果我在命令行中執行“ python template.py text.py”,則將輸出“ 1和2之和為3”。 在文件template.py中,replacement()是一個函數,為什么它是sub()函數的自變量,卻沒有自變量?(應該以match對象作為自變量)而且,作用域字典是什么因為如果是空的? 非常感謝!!!

因此,您正在詢問有關此代碼的幾個問題。 目的是很明確的:它旨在

  1. 讀取輸入文件,
  2. 合並成一行,
  3. 對於在該行中找到的方括號中的每個表達式
  4. 調用eval(code,scope) ,其中code是括號中的表達式。

現在針對您的具體問題:

  1. replace()是一個函數,為什么它是sub()函數的一個參數,卻沒有參數?

因為那是sub()函數的工作方式

回覆。 (模式,REPL,字符串,計數= 0,標志= 0)

返回通過用替換repl替換字符串中最左邊的不重疊模式所獲得的字符串 如果找不到該模式,則返回的字符串不變。 repl可以是字符串或函數 [...]如果repl是一個函數,則每次pattern的非重疊出現都會調用它。 該函數采用單個match對象參數,並返回替換字符串。

這里的模式是self變量, repl設置為我們的replacement()函數。 它將接收match對象作為參數,其中包含對每個匹配組的引用。

  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']

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM