zoukankan      html  css  js  c++  java
  • 第6.5节 exec函数:一个自说自话的强大Python动态编译器

    在Python动态执行的函数中,exec是用于执行一个字符串内包含的Python源码或其编译后对应的字节码。
    一、    语法
    1.    exec(Code, globals=None, locals=None)
    2.    参数说明
    本函数的参数与eval的参数及含义完全相同,不过第一个参数eval函数要求是表达式字符串或其编译的字节码,exec要求是Python语句或语句块或其编译的代码,如果是编译的代码,要求是‘exec’模式编译,如果表达式,则也不会报错,但达不到eval返回计算值的效果;
    3.    返回值
    如果代码能正常执行该函数返回值是 None,因此对应代码不能用return和 yield返回数据。
    二、    exec与语法与eval对比
    1.    exec与语法与eval 类似,都属于动态执行,有相同的参数,都可以直接处理字符串,也可以处理compile处理后的字节码;
    2.    不同的地方包括3个方面:
    1)    eval()只能计算单个表达式的值,而exec()函数可以动态运行代码段;
    2)    eval()函数可以有返回值,而exec()函数返回值永远为None
    3)    如果是参数中传递的是compile 的字节码,则compile调用时的mode参数取值不同。
    三、    举例:
    1.    用三引号定义了一个包含Python代码的字符串

    s='''
    person=['张三','李四']
    for p in person:
       print('name=',p)
    while(True):
        s=input("I will exit,are you ready(y/n)?")
        if s=='Y': break;
        if s=='y': break;
    '''


    2.    带一个匿名名字空间作为全局名字空间执行该语句:exec(s,{}),执行后输入‘y’退出,s的值保持不变
    3.    不带全局名字空间和局部名字空间执行该语句:exec(s),执行后输入‘y’退出,s的值变成‘y’,说明该代码段在当前执行exec调用的名字空间中执行,并访问了相关变量,导致变量s的值被篡改
    上述案例全部截屏:

    本节老猿详细介绍了动态执行的exec函数及各个参数,并结合例子介绍了相关方法的使用。从上述介绍以及案例可以说,exec函数就是一个完整版本的Python编译器,它可以将一个完整的Python源文件完整的执行。这也就是老猿说exec是自说自话。老猿其实很想做一个测试,就是用一个动态执行的Python代码读取自身的源代码再去执行,是否形成递归调用呢?不知道是什么效果,有兴趣的同学可以自己试。
    老猿Python(https://blog.csdn.net/LaoYuanPython)系列文章用于逐步介绍老猿学习Python后总结的学习经验,这些经验有助于没有接触过Python的程序员可以很容易地进入Python的世界。
    欢迎大家批评指正,谢谢大家关注!

  • 相关阅读:
    golang动态加载原生代码思路
    boltdb的实现和改进
    如何保证数据掉电不损坏?
    msgpack库的神奇用法
    消息推送与同步协议的思考
    cassandra的gc调优
    tcp链接断开的探测
    加速和监控国际网络
    轻松逃脱某防火墙对ss的探测
    java文件操作之war压缩解压
  • 原文地址:https://www.cnblogs.com/LaoYuanPython/p/11087714.html
Copyright © 2011-2022 走看看