• python系列——eval知识点


    一、eval()函数是什么?

    • Python的一个内置函数;
    • 返回传入字符串的表达式结果(官方)

    二、eval()函数语法解析

    eval(expression[, globals[, locals]])
    
    # expression : 表达式。
    # globals : 变量作用域,全局命名空间,如果被提供,则必须是一个字典对象。
    # locals : 变量作用域,局部命名空间,如果被提供,可以是任何映射对象。
    

    三、eval()函数应用举例

    3.1 eval()基本应用举例

    print(eval('66+72')) # 把字符串解析成66+72的结果
    print( eval("{'name':'linux','age':18}") ) # 把字符串转为字典
    print( eval("[[1,2], [3,4], [5,6], [7,8], [9,0]]") ) # 把字符串转为列表
    print(eval("{'name':'linux','age':age}",{"age":18})) # 传递globals参数值为{“age”:18}
    
    age=18
    print(eval("{'name':'linux','age':age}",{"age":20},locals())) # 传递locals参数,局部命名空间
    输出结果:

    138
    {'name': 'linux', 'age': 18}
    [[1, 2], [3, 4], [5, 6], [7, 8], [9, 0]]
    {'name': 'linux', 'age': 18}
    {'name': 'linux', 'age': 18}

    上述例子中,展示了eval()的3个应用:

    • 把字符串转化为代码表达式求结果,如 66+72
    • 把字符串转化为其它数据类型,如字典、列表、元组、集合等
    • 传递globals参数和locals参数,当两个参数都存在时,先查找locals参数,再查找globals参数,locals参数中同名变量会覆盖globals中的变量

    3.2 eval()危害举例

    str1 = "__import__('os').system('rm -rf ./a.txt')"  # 删除当前目录下的a.txt文件
    eval( str1 )
    str2 = "__import__('os').system('ls')" # 显示当前代码路径下的所有代码文件名称
    eval( str2 )
    

    上述例子中,eval()将字符串转成表达式并执行,就可以利用其执行系统命令,删除文件等操作。

    3.3 ast.literal_eval()替代eval()实现数据类型转换

    import ast
    
    print( ast.literal_eval("{'name':'linux','age':18}") )
    print( ast.literal_eval("[[1,2], [3,4], [5,6], [7,8], [9,0]]") )
    
    输出结果:
    {'name': 'linux', 'age': 18}
    [[1, 2], [3, 4], [5, 6], [7, 8], [9, 0]]

    上述代码也能完成类型转换,但由于没有使用eval(),所以产生的安全风险较小。
    literal_eval() 函数:会判断需要计算的内容计算后是不是合法的python类型,如果是则进行运算,否则就不进行运算。

  • 相关阅读:
    从头带你撸一个Springboot Starter
    Spring Cache 带你飞(二)
    2021年终总结
    数据中台(介绍篇)
    NetCore实现全局模型绑定异常信息统一处理
    [源码解析] PyTorch 分布式之弹性训练(2)启动&单节点流程
    [源码解析] PyTorch 分布式(18) 使用 RPC 的分布式管道并行
    [源码解析] PyTorch 分布式之弹性训练(1) 总体思路
    [源码解析] PyTorch 分布式之弹性训练(3)代理
    [源码解析] PyTorch 分布式之弹性训练(5)Rendezvous 引擎
  • 原文地址:https://www.cnblogs.com/miaoxiaochao/p/13302135.html
Copyright © 2020-2023  润新知