Python学习笔记之eval()函数简析

个人博客,支持一下呗!https://raycoder.me
本文首发于Ray's Blog

一个最基本的eval()函数的格式应该如下:

>>> command = 'print(\'Hello world!\')'
>>> eval(command)
Hello world!

没错,eval函数是一个可以让字符串转换为表达式的内置函数(注意eval()不支持任何形式的赋值操作,而不能是复杂的代码逻辑)。
eval()函数不仅可以执行代码,还可以作如下操作:

>>> eval('[1, 2, 3]') #字符串转列表
[1, 2, 3]
>>> eval('(1, 2, 3)') #字符串转元组
(1, 2, 3)
>>> eval('{"one": 1, "two": 2, "three": 3}') #字符串转字典
{'one': 1, 'two': 2, 'three': 3}
>>> eval('0o187')
0o187

eval()函数的完整格式如下:

eval(expression[, globals[, locals]])

expression: 表达式。
globals: 变量作用域,全局命名空间,如果被提供,则必须是一个字典对象。
locals: 变量作用域,局部命名空间,如果被提供,可以是任何映射对象。

当后两个参数都为空时,很好理解,就是一个string类型的算术表达式,计算出结果即可。等价于eval(expression)。
当locals参数为空,globals参数不为空时,先查找globals参数中是否存在变量,并计算。
当两个参数都不为空时,先查找locals参数,再查找globals参数。
无良引用一段Python官方的文档:

eval(expression[, globals[, locals]])
实参是一个字符串,以及可选的 globals 和 locals。globals 实参必须是一个字典。locals 可以是任何映射对象。
expression 参数会作为一个 Python 表达式(从技术上说是一个条件列表)被解析并求值,并使用globals 和 locals 字典作为全局和局部命名空间。 如果 globals 字典存在且不包含以 __builtins__为键的值,则会在解析 expression 之前插入以此为键的对内置模块 builtins 的引用。 这意味着 expression 通常具有对标准 builtins 模块的完全访问权限且受限的环境会被传播。 如果省略 locals 字典则其默认值为 globals 字典。 如果两个字典同时省略,则表达式执行时会使用 eval() 被调用的环境中的 globals 和 locals。 请注意,eval() 并没有对外围环境下的 (非局部)嵌套作用域 的访问权限。
返回值就是表达式的求值结果。 语法错误将作为异常被报告。 例如:
>>> x = 1
>>> eval('x+1')
2
这个函数也可以用来执行任何代码对象(如compile()创建的)。这种情况下,参数是代码对象,而不是字符串。如果编译该对象时的 mode 实参是'exec' 那么 eval() 返回值为 None
提示: exec() 函数支持动态执行语句。 globals()locals() 函数各自返回当前的全局和本地字典,因此您可以将它们传递给 eval() 或 exec() 来使用。


实战:

传递全局变量

>>> print(eval("{'name':'linux','age':age}",{"age":1822}))
{'name': 'linux', 'age': 1822}

传递本地变量

>>> age=18
>>> print(eval("{'name':'linux','age':age}",{"age":1822},locals()))
{'name': 'linux', 'age': 18}

传递参数其实可以如下实现(伪)

>>> eval('print')('123')
123

不可进行任何形式的赋值

>>> eval('a=1')
Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    eval('a=1')
  File "<string>", line 1
    a=1
     ^
SyntaxError: invalid syntax
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 226,197评论 6 524
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 97,254评论 3 410
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 173,718评论 0 370
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 61,801评论 1 305
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 70,732评论 6 404
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 54,200评论 1 318
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 42,389评论 3 433
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 41,484评论 0 282
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 48,024评论 1 328
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 40,013评论 3 352
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 42,125评论 1 359
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 37,698评论 5 353
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 43,407评论 3 342
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 33,795评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 34,996评论 1 278
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 50,724评论 3 384
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 47,150评论 2 368

推荐阅读更多精彩内容

  • 内置函数Python解释器内置了许多功能和类型,总是可用的。他们是按字母顺序列在这里。 abs(x)返回一个数的绝...
    uangianlap阅读 1,246评论 0 0
  • abs() 函数 描述 abs() 函数返回数字的绝对值。 语法 以下是 abs() 方法的语法: abs( x ...
    时光是座城阅读 494评论 0 2
  • 1、abs() 描述: 函数返回数字的绝对值 语法:abs() 参数:x--数值表达式,可以是整数,浮点数,...
    清清子衿木子水心阅读 415评论 0 0
  • 今天是2017年9月17日,星期天,今天天气阴。我坐在拥有上下铺的上铺位置敲着键盘,想好好地写一些东西,记...
    向明天致敬阅读 137评论 0 0
  • 移动工作室 「我是一个什么都做不好的人。」 「我觉得自己的能力不足以堪此重任。」 你常 常会有这种想法吗,人一定会...
    续写不尽de未来阅读 460评论 0 3