在使用python写代码的时候,有时候你会遇到这种情况 ,所定义的变量值里本身就是一种数据类型,或者是一个表达式 ,比如下面的例子

res1 = "{'a':1,'b':2}" x,y = 3,8 res2 = "x * y"
这个时候,你真正可能想要的是返回这个数据类型的值或是表达式计算后的值 ,而非所有原本的字符串 。也就是下面的这个例子 。
如果你只想到从str里找对应的方法解决问题 ,你是很难知道答案的 ,那么像这样的需求,该如何解决呢 ?
其实只要知道了下面的这个函数,这类的需求也就非常容易实现了 。
1.eval介绍
功能
用例执行一个字符串表达式,并返回表达式的值
这里的表达式可以是:
数据类型,如字典 ,元祖 ,列表 。表达式 :如 ,加、减、乘、除 。函数 : 如内置函数 ,自定义函数 。语法格式
eval(expression[, globals[, locals]]) expression:表达式字符串globals:可选,必须是一个字典locals:可选,可以是任何 map 对象
其中,expression是最常用的参数之一,这里只介绍expression
示例
常用数据类型转化
# 数据类型的转化 dict_str = '{"a":1,"b":2}' list_str = '[1,2,3,4]' tuple_str = '("a","b","c","d")' print("数据类型:",type(dict_str),type(list_str),type(tuple_str)) #都返回 :<class 'str'> new_str1 = eval(dict_str) new_str2 = eval(list_str) new_str3 = eval(tuple_str) print("new_str1:{},数据类型:{}".format(new_str1,type(new_str1))) print("new_str2:{},数据类型:{}".format(new_str2,type(new_str2))) print("new_str3:{},数据类型:{}".format(new_str3,type(new_str3))) # 返回结果 : """ new_str1:{'a': 1, 'b': 2},数据类型:<class 'dict'> new_str2:[1, 2, 3, 4],数据类型:<class 'list'> new_str3:('a', 'b', 'c', 'd'),数据类型:<class 'tuple'> """
表达式转化
# 表达式转化 a = 10 b = 5 res = eval("a * b - a/b") print(res) # 结果 :48 res1 = "'python' if a > b else 'java'" print(eval(res1)) #结果 :python lst = '[x for x in range(5)]' res2 = eval(lst) print(res2) # [0, 1, 2, 3, 4]
函数转化
# 自定义函数 def add(x,y): return x + y res = 'add(3,4)' print("自定义函数转化:",eval(res)) # 结果 : 7 ,调用add相加 print("内置函数转化:",eval('pow(3,2)')) # 结果 :9 ,调用内置函数:次方
场景说明
那么这个eval到底在什么场景下会使用到呢 ? 因为在上面的案例中,我们都可以直接将变量的值定义成对应的数据类型 ,表达式 ,函数的。具体如下:
dct = {"a":1,"b":2} res1 = add(3,4)
那为什么多此一举地将其定义成字符串,然后再进行转化呢 ?
这是因为在某些特殊场景下确实会出现这种情况 ,比如我要解析一个某种格式的http响应包 ,它里面的原始内容格式就是字符串 ,比如下面这个部分,你如果想提取里面headers的值,最终想要的肯定是一个字典而不是字符串,这个时候就可以将提取出来的值进行eval转化 。
fetch("https://webapi.sporttery.cn/gateway/xxx/getFxxxx.qry?isVerify=1¶m=94%2C0%3B90%2C0%3B98%2C0", { "headers": { "accept": "application/json, text/javascript, */*; q=0.01", "accept-language": "zh-CN,zh;q=0.9", "sec-ch-ua": ""Google Chrome";v="93", " Not;A Brand";v="99", "Chromium";v="93"", "sec-ch-ua-mobile": "?0", "sec-ch-ua-platform": ""Windows"", "sec-fetch-dest": "empty", "sec-fetch-mode": "cors", "sec-fetch-site": "cross-site" }, "referrer": "https://www.xxx.gov.cn/", "referrerPolicy": "strict-origin-when-cross-origin", "body": null, "method": "GET", "mode": "cors", "credentials": "omit" });
再比如你想定义一个模板 ,模板里的内容希望能使灵活的值 ,比如parameters里的值希望是一个从函数里获取到的值 ,这个时候就可以用到eval啦 。
- interface: interface_name: "aaa" method: "post" path: "/dynamicapi/shopadaction/add/" parameters: 'add(3,4)'
总结
如果在你处理的字符串遇到以下这种情况 ,不妨试试eval这个函数 。


还没有评论,来说两句吧...