python中究极残暴的eval()函数用法,字符串转换的福星

eval()函数十分强大,官方demo解释为:将字符串str当成有效的表达式来求值并返回计算结果。

so,结合math当成一个计算器很好用。

其他用法,可以把list,tuple,dict和string相互转化。见下例子:

>>> a = "[[1,2], [3,4], [5,6], [7,8], [9,0]]"
  >>> b = eval(a)
  >>> b
  >>> [[1, 2], [3, 4], [5, 6], [7, 8], [9, 0]]
  >>> type(b)
  >>> list


  >>> a = "{1: 'a', 2: 'b'}"
  >>> b = eval(a)
  >>> b
  >>> {1: 'a', 2: 'b'}
  >>> type(b)
  >>> dict


  >>> a = "([1,2], [3,4], [5,6], [7,8], (9,0))"
  >>> b = eval(a)
  >>> b
  >>> ([1, 2], [3, 4], [5, 6], [7, 8], (9, 0))


如果有大文件还可以用compile 加强一下

compile(source, filename, mode[, flags[, dont_inherit]])

  中文说明:将source编译为代码或者AST对象。代码对象能够通过exec语句来执行或者eval()进行求值。

  参数source:字符串或者AST(Abstract Syntax Trees)对象。

  参数 filename:代码文件名称,如果不是从文件读取代码则传递一些可辨认的值。

  参数model:指定编译代码的种类。可以指定为 ‘exec’,’eval’,’single’。

  参数flag和dont_inherit:这两个参数暂不介绍,可选参数。

>>> s = 12;
   >>> b = 5;
   >>> code = "s+b*12"
   >>> copcode = compile(code,'  ','eval')
   >>> eval(copcode)
   72
   >>> 


不可谓不强大!

BUT!强大的函数有代价。安全性是其最大的缺点。

想一想这种使用环境:需要用户输入一个表达式,并求值。

如果用户恶意输入,例如:

__import__('os').system('dir')

那么eval()之后,你会发现,当前目录文件都会展现在用户前面。

那么继续输入:

open('文件名').read()

代码都给人看了。获取完毕,一条删除命令,文件消失。哭吧!

怎么避免安全问题?

1、自行写检查函数;

2、使用ast.literal_eval: 自行查看DOCUMENT

本文由@The_Third_Wave(Blog地址: http://blog.youkuaiyun.com/zhanh1218 )原创。还有未涉及的,会不定期更新,有错误请指正。

如果你看到这篇博文时发现没有不完整,那是我为防止爬虫先发布一半的原因,请看原作者Blog。

如果这篇博文对您有帮助,为了好的网络环境, 不建议转载,建议收藏! 如果您一定要转载,请带上后缀和本文地址。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值