python之eval函数的应用实例
众所周知,eval() 函数是用来执行一个字符串表达式,并返回表达式的值。
语法:eval(expression[, globals[, locals]])
eval函数有很强大的用法,但也有一定的风险性。这里主要记录项目中用到的eval函数的两种用法。
一、将字符串转换为相应的对象
如:将string转换为list、tuple、dict
例:将string转换为dict
data = "{'username':'admin','pwd':'123456'}" print(data,type(data)) data = eval(data) print(data, type(data))
如上代码输出为:
{'username':'admin','pwd':'123456'} <class 'str'> {'username': 'admin', 'pwd': '123456'} <class 'dict'>
可以看到,eval函数转换后,就将原来string类型的data转换为dict了。
实际上,转换前的data也是一个json字符串,也就是实现了json->dict。
实战:
在接口自动化框架中,我们通常把测试数据存放在excel中,利用openpyxl从excel中读取测试数据用于测试。
直接从excel中读出来的都是string类型,一般我们的请求参数是dict类型,这就需要把读取的string类型的数据转换为dict。
从excel中读取某sheet第二行第五列的数据:{'username':'admin','pwd':'123456'}
from openpyxl import load_workbook sheet = load_workbook(bookname)[sheetname] data = sheet.cell(2, 5).value
直接读取出来的data类型是string,相当于:”{'username':'admin','pwd':'123456'}“
使用data = eval(data) ,转换为dict类型,就可以传到请求参数里啦。
二、将字符串转成表达式并执行
先看一个简单的例子:
eval('print("我是test语句")')
如上代码实际上会执行 print("我是test语句") 这段代码。也就是eval将 ‘print("我是test语句")’ 这段字符串转成了可执行的python语句,并执行它。
实战:
测试几个webservice接口:
from suds.client import Client def ws(url,data,method): client = Client(url) if method == 'sendMCode': result = client.service.sendMCode(data) return result
webservice接口是如上这样的调用方式,如上代码调用了senMCode的接口。如果我们有很多个接口,可能就需要写很多个if语句,会很繁琐,这是不可取的。
这时候eval就派上用场了:
from suds.client import Client def ws(url,data,method): client = Client(url) result = eval('client.service.{0}({1})'.format(method, data)) return result
让eval函数把 'client.service.{0}({1})'.format(method, data) 转成可执行的python语句,就可以把method也参数化,不需要那么多if语句了。