#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()函数的参数而且它没有参数?(它应该将匹配对象作为参数)而且,范围字典是什么如果它是空的? 非常感谢!!!
答案 0 :(得分:4)
所以你问了几个关于这段代码的问题。它打算做的很清楚:它的目的是
eval(code,scope)
,其中code
是括号内的表达式。现在针对您的具体问题:
- replacement()是一个函数,为什么它是sub()函数的参数而且它没有参数?
醇>
因为这就是sub()
function的工作原理
重新。 sub (模式,repl,字符串,count = 0,flags = 0)
返回通过替换 string 中最左边不重叠的模式而获得的字符串 REPL 。如果未找到模式,则 string 将保持不变。 REPL 可以是字符串或函数; [...] 如果 repl 是一个函数,则会为每个非重叠调用它 出现模式。该函数采用单个匹配对象 参数,并返回替换字符串。
此处模式是self
参数,repl
设置为replacement()
函数。它将接收匹配对象作为参数,其中包含对每个匹配组的引用。
- 而且,如果它是空的,范围字典是什么?
醇>
这是用于跟踪变量赋值的字典。它将作为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']