python中eval方法的妙用

python中eval方法的妙用

python中eval的妙用

对于python中的eval函数,通常就知道是一个计算函数,比如:

eval("111")
Out[7]: 111
x = 1
y = eval("x+1")
y
Out[30]: 2

但是最近发现,eval函数可以将字符类型中的格式转化成对应的数据类型;例如

a = """{"a":"b"}"""
type(a)
Out[3]: str
b = eval(a)
b
Out[5]: {'a': 'b'}
type(b)
Out[6]: dict

可以看到,字符串a,内容上是dict格式.但是想直接强转

c = dict(a)
Traceback (most recent call last):
  File "C:\ProgramData\Anaconda3\lib\site-packages\IPython\core\interactiveshell.py", line 3398, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-8-37ec6a275a35>", line 1, in <cell line: 1>
    c = dict(a)
ValueError: dictionary update sequence element #0 has length 1; 2 is required

又比如

a
Out[12]: '[["000001","HXCZHH","hahahaha","2","HUAXIACHENGZHANGHUNHE"]]'
b = list(a)
b[0]
Out[14]: '['
c = eval(a)
c[0]
Out[16]: ['000001', 'HXCZHH', 'hahahaha', '2', 'HUAXIACHENGZHANGHUNHE']
type(a)
Out[17]: str
type(b), type(c)
Out[18]: (list, list)

这里,a是字符串,里面的内容是一个嵌套的list.
可以看到,直接用list强转,可以成功,但并不是我们想要的结果;
用eval函数,就可以实现一步转换,实在是方便至极.

官方文档不太理解

eval(expression[, globals[, locals]])
实参是一个字符串,以及可选的 globalslocals.globals 实参必须是一个字典.locals 可以是任何映射对象.

表达式解析参数 expression 并作为 Python 表达式进行求值(从技术上说是一个条件列表),采用 globalslocals 字典作为全局和局部命名空间. 如果存在 globals 字典,并且不包含 __builtins__ 键的值,则在解析 expression 之前会插入以该字符串为键以对内置模块 builtins 的字典的引用为值的项. 这样就可以在将 globals 传给 eval() 之前通过向其传入你自己的 __builtins__ 字典来控制可供被执行代码可以使用哪些内置模块. 如果 locals 字典被省略则它默认为 globals 字典. 如果两个字典都被省略,则将使用调用 eval() 的环境中的 globalslocals 来执行该表达式. 注意,eval() 无法访问闭包环境中的 嵌套作用域 (非局部变量).

返回值就是表达式的求值结果. 语法错误将作为异常被报告. 例如:

x = 1
eval('x+1')
2
该函数还可用于执行任意代码对象(比如由 compile() 创建的对象). 这时传入的是代码对象,而非一个字符串了.如果代码对象已用参数为 mode 的 'exec' 进行了编译,那么 eval() 的返回值将为 None.
  • 关于 官方文档 ,参考 [这儿][1].
    [1]: https://docs.python.org/zh-cn/3/library/functions.html?highlight=eval#eval
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值