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文件,再然后讲分割的文件组成一个字符串表示的函数,再再然后就是利用上述方法执行字符串表示的函数。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Vamei实验室

Java进阶05 多线程

多线程 多线程(multiple thread)是计算机实现多任务并行处理的一种方式。 在单线程情况下,计算机中存在一个控制权,并按照顺序依次执行指令。单线程好...

24560
来自专栏专注 Java 基础分享

深入理解Struts2----类型转换

     之前的一系列文章主要介绍了有关Struts2的一些基本用法和部分的简单原理,但是始终没有介绍有关拦截器的相关内容,从本篇开始我们将从另一个角度去深入理...

23990
来自专栏博客园

MSIL学习------从HelloWorld开始

  前段时间突然想搞搞IL语言,于是在博客园中找到了包建强前辈关于IL的文章学习,并且在包前辈博客里看到了09年他与赵劼前辈关于是否有必要学习IL语言的争论,作...

14930
来自专栏偏前端工程师的驿站

意译:《JVM Internals》

译者语                                  为加深对JVM的了解和日后查阅时更方便,于是对原文进行翻译。内容是建立在我对JVM的认...

25970
来自专栏技术小黑屋

Java中的堆和栈的区别

当一个人开始学习Java或者其他编程语言的时候,会接触到堆和栈,由于一开始没有明确清晰的说明解释,很多人会产生很多疑问,什么是堆,什么是栈,堆和栈有什么区别?更...

18730
来自专栏Java面试通关手册

可能是把Java内存区域讲的最清楚的一篇文章

哈哈 皮一下!我自己开源的一个Java学习指南文档。一份涵盖大部分Java程序员所需要掌握的核心知识,正在一步一步慢慢完善,期待您的参与。Github地址:ht...

11020
来自专栏屈定‘s Blog

并行设计模式--immutable模式

线程不安全的原因是共享了变量且对该共享变量的操作存在原子性、可见性等问题,因此一种解决思路就是构造不可变的对象,没有修改操作也就不存在并发竞争,自然也不需要额外...

19660
来自专栏Golang语言社区

Go Channel 应用模式(二)

eapache/channels提供了一些channel应用模式的方法,比如上面的扇入扇出模式等。

17530
来自专栏佳爷的后花媛

java基础知识

Vector、Stack、HashTable、ConcurrentHashMap、Properties

32550
来自专栏数据科学

redis流计算

使用了tornado的异步和streamz的流处理两个库,需要redis 5.0以上版本

27150

扫码关注云+社区

领取腾讯云代金券