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语句了。