zoukankan      html  css  js  c++  java
  • Python内置函数----exec

     

     

    英文文档:

    exec(object[, globals[, locals]])
    This function supports dynamic execution of Python code. object must be either a string or a code object. If it is a string, the string is parsed as a suite of Python statements which is then executed (unless a syntax error occurs). [1] If it is a code object, it is simply executed. In all cases, the code that’s executed is expected to be valid as file input (see the section “File input” in the Reference Manual). Be aware that the return and yieldstatements may not be used outside of function definitions even within the context of code passed to the exec() function. The return value is None.
    In all cases, if the optional parts are omitted, the code is executed in the current scope. If only globals is provided, it must be a dictionary, which will be used for both the global and the local variables. If globals and localsare given, they are used for the global and local variables, respectively. If provided, locals can be any mapping object. Remember that at module level, globals and locals are the same dictionary. If exec gets two separate objects as globals and locals, the code will be executed as if it were embedded in a class definition.
    If the globals dictionary does not contain a value for the key __builtins__, a reference to the dictionary of the built-in module builtins is inserted under that key. That way you can control what builtins are available to the executed code by inserting your own __builtins__ dictionary into globals before passing it to exec().
    Note
    The built-in functions globals() and locals() return the current global and local dictionary, respectively, which may be useful to pass around for use as the second and third argument to exec().
    Note
    The default locals act as described for function locals() below: modifications to the default locals dictionary should not be attempted. Pass an explicit locals dictionary if you need to see effects of the code on locals after function exec() returns.
    说明:
      
      1.  exec函数和eval函数类似,也是执行动态语句,只不过eval函数只用于执行表达式求值,而exec函数主要用于执行语句块。
    复制代码
    >>> eval('a=1+2') #执行语句报错
    Traceback (most recent call last):
      File "<pyshell#0>", line 1, in <module>
        eval('a=1+2')
      File "<string>", line 1
        a=1+2
         ^
    SyntaxError: invalid syntax
    
    >>> exec('a=1+2') #执行语句
    >>> a
    3
    复制代码

      2. 第一个参数为语句字符串,globals参数和locals参数为可选参数,如果提供,globals参数必需是字典,locals参数为mapping对象。

      3. globals参数用来指定代码执行时可以使用的全局变量以及收集代码执行后的全局变量

    复制代码
    >>> g = {'num':2}
    >>> type(g)
    <class 'dict'>
    
    >>> exec('num2 = num + 2',g)
    
    >>> g['num']
    2
    >>> g['num2'] #收集了exec中定义的num2全局变量
    4
    复制代码

      4. locals参数用来指定代码执行时可以使用的局部变量以及收集代码执行后的局部变量

    复制代码
    >>> g = {'num':2}
    >>> type(g)
    <class 'dict'>
    >>> l = {'num2':3}
    >>> type(l)
    <class 'dict'>
    
    >>> exec('''
    num2 = 13
    num3 = num + num2
    ''',g,l)
    
    >>> l['num2'] #l中num2值已经改变
    13
    复制代码

      5. 为了保证代码成功运行,globals参数字典不包含 __builtins__ 这个 key 时,Python会自动添加一个key为 __builtins__ ,value为builtins模块的引用。如果确实要限制代码不使用builtins模块,需要在global添加一个key为__builtins__,value为{}的项即可(很少有人这么干吧)。

    复制代码
    >>> g = {}
    >>> exec('a = abs(-1)',g)
    >>> 
    
    >>> g = {'__builtins__':{}}
    >>> exec('a = abs(-1)',g) #不能使用内置函数了
    Traceback (most recent call last):
      File "<pyshell#30>", line 1, in <module>
        exec('a = abs(-1)',g)
      File "<string>", line 1, in <module>
    NameError: name 'abs' is not defined
    复制代码

      6. 当globals参数不提供是,Python默认使用globals()函数返回的字典去调用。当locals参数不提供时,默认使用globals参数去调用。

    复制代码
    >>> num = 1
    >>> exec('num2 = num + 1')
    >>> globals()
    {'__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__name__': '__main__', '__spec__': None, '__builtins__': <module 'builtins' (built-in)>, '__doc__': None, 'num2': 2, 'num': 1}
    >>> 
    >>> 
    >>> exec('num2 = num + 1',{}) #指定了globals参数,globals中无num变量 执行失败
    Traceback (most recent call last):
      File "<pyshell#5>", line 1, in <module>
        exec('num2 = num + 1',{})
      File "<string>", line 1, in <module>
    NameError: name 'num' is not defined
    
    
    >>> l = locals()
    >>> l
    {'__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__name__': '__main__', '__spec__': None, '__builtins__': <module 'builtins' (built-in)>, '__doc__': None, 'l': {...}, 'num2': 2, 'num': 1}
    >>> 
    >>> exec('num3 = num + 1',{},l)#指定了globals参数,globals中无num变量,指定了locals变量,locals变量含有num变量 执行成功
    >>> l
    {'__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__name__': '__main__', '__spec__': None, 'num3': 2, '__builtins__': <module 'builtins' (built-in)>, '__doc__': None, 'l': {...}, 'num2': 2, 'num': 1}
    >>> 
  • 相关阅读:
    四种解释
    CFA知识框架
    VMWare 开源 Octant,可视化的 Kubernetes 工作负载仪表板
    从贝叶斯方法谈到贝叶斯网络
    06-STM32+W5500+AIR202基本控制篇-实现功能1,功能2和功能4服务器搭建-购买云服务器(电脑)(.Linux系统)
    06-STM32+W5500+AIR202基本控制篇-实现功能1,功能2和功能4服务器搭建-购买云服务器(电脑)(.Windows系统)
    05-STM32+W5500+AIR202基本控制篇-功能5-Android和微信小程序扫描二维码绑定GPRS,并通过MQTT实现485,422通信和继电器控制(微信小程序)
    05-STM32+W5500+AIR202基本控制篇-功能4-Android和微信小程序扫描二维码绑定GPRS,并通过MQTT实现485,422通信和继电器控制(Android)
    04-STM32+W5500+AIR202基本控制篇-功能2-Android和微信小程序使用MulticastBind绑定W5500,并通过MQTT实现485,422通信和继电器控制(Android)
    数据库基础开源学习教程-android 使用 litepal 操作本地数据库
  • 原文地址:https://www.cnblogs.com/alexzu/p/9783397.html
Copyright © 2011-2022 走看看