我不太了解Python

时间:2017-10-07 11:34:17

标签: 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()函数的参数而且它没有参数?(它应该将匹配对象作为参数)而且,范围字典是什么如果它是空的? 非常感谢!!!

1 个答案:

答案 0 :(得分:4)

所以你问了几个关于这段代码的问题。它打算做的很清楚:它的目的是

  1. 阅读输入文件
  2. 将其合并为一行,
  3. 对于在该行中找到的方括号中的每个表达式
  4. 致电eval(code,scope),其中code是括号内的表达式。
  5. 现在针对您的具体问题:

      
        
    1. replacement()是一个函数,为什么它是sub()函数的参数而且它没有参数?
    2.   

    因为这就是sub() function的工作原理

      

    重新。 sub (模式,repl,字符串,count = 0,flags = 0)

         

    返回通过替换 string 中最左边不重叠的模式而获得的字符串    REPL 。如果未找到模式,则 string 将保持不变。 REPL   可以是字符串或函数; [...]   如果 repl 是一个函数,则会为每个非重叠调用它   出现模式。该函数采用单个匹配对象   参数,并返回替换字符串。

    此处模式是self参数,repl设置为replacement()函数。它将接收匹配对象作为参数,其中包含对每个匹配组的引用。

      
        
    1. 而且,如果它是空的,范围字典是什么?
    2.   

    这是用于跟踪变量赋值的字典。它将作为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']