• Web模板引擎本质前奏


    执行字符串表示的函数,并为该函数提供全局变量:

     1 #! /usr/bin/env python3
     2 
     3 namespace = {'name': 'zingp', 'data': [16, 19, 25]}
     4 
     5 code = '''def sayHi():return  "name %s ,age %d" %(name,data[1],) '''
     6 
     7 func = compile(code, '<string>', "exec")
     8 # print("func>>>:",func)
     9 exec(func, namespace)
    10 # print(namespace)
    11 result = namespace['sayHi']()
    12 
    13 print(result)

    运行结果:name zingp ,age 19

    上述代码解析:

    • 第5行,code是一个字符串,该字符串的内容是一个函数体。
    • 第7行,将code字符串编译成函数 sayHi
    • 第9行,将函数 sayHi添加到namespace字典中(key为 sayHi),同时也将python的所有内置函数添加到namespace字段中(key为__builtins__),这样,我们print(namespace)会得到以下一个字典:
    1 {'sayHi': <function sayHi at 0x02036D20>, 'data': [16, 19, 25], 'name': 'zingp', '__builtins__': {python的所有内置函数...}}

    而且namespace字典的中的key,value好比是一个个的全局变量:

    1 name = 'zingp'
    2 data = [16, 19, 25]
    3 def sayHi():
    4     return "name %s ,age %d" % (name,data[1],)
    • 第11行,执行sayHi函数并将返回值复制给result
    • 第13行,输出result

    我了个擦,居然把字符串变成了函数并且还为该函数提供了全局变量,是不是很巧秒。这个功能其实就是python的web框架中模板语言部分至关重要的部分,因为在模板处理过程中,首先会读取html文件,然后分割html文件,再然后讲分割的文件组成一个字符串表示的函数,再再然后就是利用上述方法执行字符串表示的函数。

  • 相关阅读:
    《编写高质量代码》读书笔记
    IL,Emit之OpCodes说明(备查)
    每天进步一点点
    DOCTYPE 与浏览器模式分析[转]
    一个EL IF表达式引发的血案
    JVM系列文章
    SunOs设置环境变量
    Solaris系统查看进程与端口对应关系的命令
    jsp 报错调试
    vi命令提示:Terminal too wide
  • 原文地址:https://www.cnblogs.com/zingp/p/6087993.html
Copyright © 2020-2023  润新知