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語句了。
python之eval函數的應用實例