zoukankan      html  css  js  c++  java
  • python函数eval与ast.literal_eval的区别

    一分钟学个小知识

    evalast.literal_eval都可以将字符串还原成它能够转化成的数据类型,例如

    >>> from ast import literal_eval
    >>> 
    >>> data1 = "['ops-coffee','cn']"
    >>> data2 = "{'title':'运维咖啡吧','url':'https://ops-coffee.cn'}"
    >>> 
    >>> print(type(data1),type(data2))
    <class 'str'> <class 'str'>
    >>> 
    >>> 
    >>> 
    >>> a1 = eval(data1)
    >>> print(a1, type(a1))
    ['ops-coffee', 'cn'] <class 'list'>
    >>> 
    >>> a2 = eval(data2)
    >>> print(a2, type(a2))
    {'title': '运维咖啡吧', 'url': 'https://ops-coffee.cn'} <class 'dict'>
    >>> 
    >>> 
    >>> 
    >>> b1 = literal_eval(data1)
    >>> print(b1, type(b1))
    ['ops-coffee', 'cn'] <class 'list'>
    >>> 
    >>> b2 = literal_eval(data2)
    >>> print(b2, type(b2))
    {'title': '运维咖啡吧', 'url': 'https://ops-coffee.cn'} <class 'dict'>
    >>> 
    >>> 
    

    除了可以对数据类型进行转换外,他们还可以对字符串的输入做处理,例如

    >>> eval('1+1')
    2
    >>> 
    >>> 
    >>> literal_eval('1+1')
    2
    

    那么他们有何区别呢?

    eval会对所有他能解析的字符串都做处理,而literal_eval则会判断需要处理的内容处理后是不是合法的python类型,如果是则处理,否则不处理

    例如在以下例子中

    >>> std = input('please input: ')
    please input: __import__('os').system('ls /')
    >>> print('out: ',eval(std))
    bin  boot  dev  etc lib lost+found  opt  proc  root  run  sbin  selinux  srv	static	sys  tmp  usr  var
    out:  0
    >>> 
    

    eval处理了输入的指令,这是非常危险的,在这里仅仅是用了ls查看做测试,如果是rm之类的指令后果就会很严重,而对于literal_eval则会去判断要解析的内容是否安全,不安全就报错

    >>> 
    >>> print('out: ',literal_eval(std))
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/usr/local/lib/python3.6/ast.py", line 85, in literal_eval
        return _convert(node_or_string)
      File "/usr/local/lib/python3.6/ast.py", line 84, in _convert
        raise ValueError('malformed node or string: ' + repr(node))
    ValueError: malformed node or string: <_ast.Call object at 0x7f3b192a24a8>
    >>> 
    

    所以使用literal_eval可大大降低系统风险,有着更为安全的表现

    扫码关注公众号查看更多实用文章

    相关文章推荐阅读:

  • 相关阅读:
    mysql安装问题
    决策树算法实现
    安装scipy失败提示lapack not found
    算法复杂度分析中的符号(Θ、Ο、ο、Ω、ω)简介
    VMware 注册码
    chrome浏览器频繁卡死
    dell装系统
    关于scipy包的安装
    pip安装python包时报字符编码错
    linux中mv命令使用详解
  • 原文地址:https://www.cnblogs.com/37Y37/p/12806849.html
Copyright © 2011-2022 走看看