首页 > 编程语言 >python 里面的eval exec 还有compile

python 里面的eval exec 还有compile

时间:2024-01-12 22:56:50浏览次数:29  
标签:__ code exec python compile globals eval print

一、简介

二、操作

三、问题

 

一、简介

  eval exec 方法是python里面内置的方法,用于将字符串代码或者code对象,进行执行的方法。

  参考至:这里

二、操作

  1 eval

  计算指定表达式的值。也就是说它要执行的python代码只能是单个表达式(注意eval不支持任何形式的赋值操作),而不能是复杂的代码逻辑。会有返回值的

  1.1 传参总览

eval(expression, globals=None, locals=None)
  • expression:必选参数,可以是字符串,也可以是一个任意的code对象实例(可以通过compile函数创建)。如果它是一个字符串,它会被当作一个(使用globals和locals参数作为全局和本地命名空间的)Python表达式进行分析和解释。
  • globals:可选参数,表示全局命名空间(存放全局变量),如果被提供,则必须是一个字典对象。
  • locals:可选参数,表示当前局部命名空间(存放局部变量),如果被提供,可以是任何映射对象。如果该参数被忽略,那么它将会取与globals相同的值。

  要注意的是,eval 的表达式里面不能有赋值操作,也就是等号,不然会报错

  1.1.1 globals locals 实例

a = 1
b = 2
an1 = eval('a+b')
an2 = eval('a+b', {'a':3, 'b':4})
an3 = eval('a+b', {'a':3, 'b':4}, {'a':5, 'b':6})
print(an1)
print(an2)
print(an3)

  结果

3
7
11

  当没有globals和locals时, eval 会从当前域里面找参数, 有globals 优先于当前域, locals优先于globals 

  1.1.2 赋值错误实例

eval('a=1')
Traceback (most recent call last):
  File "<pyshell#18>", line 1, in <module>
    eval('a=1')
  File "<string>", line 1
    a=1
     ^
SyntaxError: invalid syntax

  

  2. exec 

  动态执行Python代码。也就是说exec可以执行复杂的Python代码,而不像eval函数那么样只能计算一个表达式的值。返回值为空

  2.1 传参总览

exec(object[, globals[, locals]])
  • expression:必选参数,表示需要被指定的Python代码。它必须是字符串或code对象。如果object是一个字符串,该字符串会先被解析为一组Python语句,然后在执行(除非发生语法错误)。如果object是一个code对象,那么它只是被简单的执行。
  • globals:与eval 相同。
  • locals:与eval 相同

  2.1.1 exec  实例

a = 1
b = 2
c = 3
an1 = exec('a+b')
##返回空值
print(an1)
exec('a = a+b+c')
##执行了表达式 
print(a)
long_code = """
index = 0
for item in range(10):
    index += item
print(index)
"""
an3 = exec(long_code)
print(an3)

  结果

None
6
45
None

  2.1.2 设置作用域错误使用

a = 1
b = 2
exec('a = a+b')
##没定义作用域,会修改a的值
print(a)
exec('a = a+b' ,{'b':4})
##如果定义了作用域,那么外部的域就失效了,这个运算会报错,找不到a
print(a)

  结果

3
Traceback (most recent call last):
  File "C:/Users/Administrator/Desktop/test.py", line 9, in <module>
    exec('a = a+b' ,{'b':4})
  File "<string>", line 1, in <module>
NameError: name 'a' is not defined

  3 compile

  严格意义上来将,它的作用是不同于 eval 和exec的, 它只是他们的一个参数生成器

  3.1 传参总览

compile(source, filename, mode, flags=0, dont_inherit=False, optimize=-1)

 

  • source:字符串或AST对象,表示需要进行编译的python代码
  • filename:指定需要编译的代码文件,如果不是文件读取代码则传递一些可辨认的值.
  • mode:用于标识必须当做那类代表来编译; 如果source是由一个代码语句序列组成,则指定mode='exec’,

  3.1.1 使用实例

a = 1
b = 2
code_eval = compile('a + b', '<string>', 'eval')   
code_exec = compile('a = a+b', '<string>', 'exec') 
an1 = eval(code_eval)
print(an1)
exec(code_exec)
print(a)

  结果

3
3

  3.1.2 关于AST对象

  Abstract Syntax Trees即抽象语法树。Ast是python源码到字节码的一种中间产物,借助ast模块可以从语法树的角度分析源码结构。

  在 python 中,我们可以通过自带的 ast 模块来对解析遍历语法树,通过ast.parse()可以将字符串代码解析为抽象语法树,然后通过ast.dump()可以打印这棵语法树。

import ast
root_node = ast.parse("print('hello world')")
 
print(root_node)
print(ast.dump(root_node, indent=4))

  结果

<ast.Module object at 0x000001B87F303490>
Module(
    body=[
        Expr(
            value=Call(
                func=Name(id='print', ctx=Load()),
                args=[
                    Constant(value='hello world')],
                keywords=[]))],
    type_ignores=[])

  参考至:这里

  详细有关python的ast的内容可以看这里: 去看看

三、问题

  1. 怎么查看当前域的参数

  globals()  和 locals()  ,可以返回当前所有参数的列表

g = globals()
g
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'C:/Users/Administrator/Desktop/test.py', 'a': 1, 'b': 2, 'code_eval': <code object <module> at 0x0000019B1ADEF290, file "<string>", line 1>, 'an1': 3, 'g': {...}}
l = locals()
l
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'C:/Users/Administrator/Desktop/test.py', 'a': 1, 'b': 2, 'code_eval': <code object <module> at 0x0000019B1ADEF290, file "<string>", line 1>, 'an1': 3, 'g': {...}, 'l': {...}}

 

标签:__,code,exec,python,compile,globals,eval,print
From: https://www.cnblogs.com/nobody-/p/17961733

相关文章

  • Python第一天学习笔记
    今日学习内容1.什么是编程2.计算机组成原理3.计算机操作系统4.编程语言是什么什么是编程什么是编程语言编程语言是什么:人与计算机交流的介质什么是编程编程:利用编程语言写出一个个文件,这堆文件会达到一个目的编程有什么用就像近代奴隶主奴役黑奴干活一样,我们的目的是奴......
  • Python面向对象之反射
    【一】反射【1】什么是反射反射是一种程序可以访问、检测和修改其本身状态或行为的能力。在Python中,反射主要指通过字符串的形式操作对象的属性。【2】Python中的反射通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射)【二】反射方法......
  • Python面向对象之派生
    派生【一】概要"派生"(Derivation)是指在面向对象编程中,通过创建新的类,基于已有的类(通常称为父类或基类)来构建新的类,以获取和扩展父类的属性和方法。在这个过程中,新创建的类称为子类或派生类。通俗来讲,派生是指,子类继承父类,派生出自己的属性与方法,并且重用父类的属性与方法【......
  • Python六个标准的数据类型
    Python3中有六个标准的数据类型,分别是:数字、字符串、列表、元组、集合、字典。1、Number(数字)Python中的数字有四种类型:整数、布尔型、浮点数和复数。int(整数),例如1、2、3。bool(布尔型),包括True和False两个值,分别代表真和假。举个例子:张三是不是男生?答案要么是真,要么是假。你只......
  • [oeasy]python0004_游乐场_和python一起玩耍_python解释器_数学运算
    和python玩耍......
  • python中进度条组件tqdm使用
    有的时候我们需要记录相关的执行过程,在整个过程中如果使用到了进度条,就更直观看到运行的现状。比如一下代码:importtimeif__name__=="__main__":#dosomething,进度为30time.sleep(1)print("执行了30%")#doanotherthing,进度为20time.slee......
  • org.springframework.kafka.listener.ListenerExecutionFailedException: Listener me
    问题描述kafka在yml文件中未开启批量消费时,程序正常运行;但一开启正常消费后,就直接报错;排查问题的过程中一直觉得是配置文件里的问题,最后发现是消费者接受的参数类型错误 问题本质  消费者开启批量消费数据后,不能用单个实体类接收参数,而应该用list 解决方法  修改......
  • Python使用Matplotlib包绘制x方的积分函数图像
    Matplotlib是一个常用的Python绘图库,可以用于创建各种类型的图表和可视化。本文将介绍如何使用Matplotlib包在Python中绘制x方的积分函数图像。步骤:以下是使用Matplotlib包绘制x方的积分函数图像的步骤:1.导入所需的库。2.定义要绘制的函数。3.创建一个表示x轴范围的数组。4.计算函......
  • Python中有哪些常用的工具可以用于接口自动化
    接口自动化测试是测试的重要一部分,Python作为一种流行的编程语言,提供了许多用于接口自动化测试的工具。本文将介绍一些常用的Python工具,用于接口自动化测试。1.RequestsRequests是一个Python库,用于发送HTTP请求和处理响应。它提供了一种简单而优雅的方式来发送HTTP/1.1请求,并自动处......
  • Python模块安装的前提条件及步骤详解
    Python是一种功能强大的编程语言,拥有丰富的第三方模块库。在使用这些模块之前,我们需要满足一些前提条件才能进行安装。本文将介绍Python模块安装的前提条件以及详细的安装步骤。前提条件:在安装Python模块之前,需要满足以下前提条件:1.Python解释器:确保已经正确安装了Python解释器,并且......