字符串中的字典取出value值(eval 使用及介紹)

eval:eval() 函數用來執行一個字符串表達式,並返回表達式的原始值。

例如:有個字符串 A="{'value': 'hello'}"

想要輸出該字符串的value值,應該怎麼辦。

如果僅僅是一個字典的話直接取dict['key']就可以輕鬆取出來,但是在字符串中我們就必須想辦法把字符串轉化成字典。這時候eval函數就該閃亮登場了。

代碼如下:

>>> A="{'value': 'hello'}"
>>> B=eval(A)
>>> B
{'value': 'hello'}

此時在字典情況下想取出值就輕而易舉了!

>>> B['value']

Python eval 函數妙用

eval

  功能:將字符串str當成有效的表達式來求值並返回計算結果。

  語法: eval(source[, globals[, locals]]) -> value

  參數:

    source:一個Python表達式或函數compile()返回的代碼對象

    globals:可選。必須是dictionary

    locals:可選。任意map對象

  實例展示:

可以把list,tuple,dict和string相互轉化。
#################################################
字符串轉換成列表
>>>a = "[[1,2], [3,4], [5,6], [7,8], [9,0]]"
>>>type(a)
<type 'str'>
>>> b = eval(a)
>>> print b
[[1, 2], [3, 4], [5, 6], [7, 8], [9, 0]]
>>> type(b)
<type 'list'>
#################################################
字符串轉換成字典
>>> a = "{1: 'a', 2: 'b'}"
>>> type(a)
<type 'str'>
>>> b = eval(a)
>>> print b
{1: 'a', 2: 'b'}
>>> type(b)
<type 'dict'>
#################################################
字符串轉換成元組
>>> a = "([1,2], [3,4], [5,6], [7,8], (9,0))"
>>> type(a)
<type 'str'>
>>> b = eval(a)
>>> print b
([1, 2], [3, 4], [5, 6], [7, 8], (9, 0))
>>> type(b)
<type 'tuple'>

eval()使用原因:

1)在編譯語言裏要動態地產生代碼,基本上是不可能的,但動態語言是可以,意味着軟件已經部署到服務器上了,但只要作很少的更改,只好直接修改這部分的代碼,就可立即實現變化,不用整個軟件重新加載。

2)在machin learning里根據用戶使用這個軟件頻率,以及方式,可動態地修改代碼,適應用戶的變化。

 

example:

a=1
g={'a':20}
eval("a+1",g)

返回21

#test eval() and locals()
x = 1
y = 1
num1 = eval("x+y")
print (num1)

def g():    
    x = 2    
    y = 2  
    num3 = eval("x+y")    
    print (num3)        
    num2 = eval("x+y",globals())   
    #num2 = eval("x+y",globals(),locals())    
    print (num2)
    
g()

print locals()["x"]
print locals()["y"] 
print globals()["x"]
print globals()["y"]

 

num1的值是2;num3的值也很好理解,是4;num2的值呢?由於提供了globals()參數,那麼首先應當找全局的x和y值,也就是都爲1,那麼顯而易見,num2的值也是2。如果註釋掉該句,執行下面一句呢?根據第3)點可知,結果爲4

 

locals()對象的值不能修改,globals()對象的值可以修改


#test globals() and locals()

z=0
def f():    
    z = 1    
    print (locals())        
    locals()["z"] = 2    
    print (locals())      
f() 
globals()["z"] = 2
print (z)

可以得出,兩個print (locals())的結果是一樣的,說明沒有修改成功。而print (z)的值是2,說明修改成功了

 

eval有安全性問題,比如用戶惡意輸入就會獲得當前目錄文件

eval("__import__('os').system('dir')")
>>> import os
>>> 'os' in globals()
True
>>> os.system('whoami')
ap\zhail
0

 

怎麼避免安全問題?

1、自行寫檢查函數;

2、使用ast.literal_eval

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章