eval()官方文檔里面給出來的功能解釋是:將字符串string對象轉化為有效的表達式參與求值運算返回計算結果
語法上:調用的是:eval(expression,globals=None, locals=None)返回的是計算結果
其中:
expression是一個參與計算的python表達式
globals是可選的參數,如果設置屬性不為None的話,就必須是dictionary對象了
locals也是一個可選的對象,如果設置屬性不為None的話,可以是任何map對象了
python是用命名空間來記錄變量的軌跡的,命名空間是一個dictionary,鍵是變量名,值是變量值。
當一行代碼要使用變量 x 的值時,Python 會到所有可用的名字空間去查找變量,按照如下順序:
1)局部名字空間 - 特指當前函數或類的方法。如果函數定義了一個局部變量 x, 或一個參數 x,Python 將使用它,然后停止搜索。
2)全局名字空間 - 特指當前的模塊。如果模塊定義了一個名為 x 的變量,函數或類,Python 將使用它然后停止搜索。
3)內置名字空間 - 對每個模塊都是全局的。作為最后的嘗試,Python 將假設 x 是內置函數或變量。
舉例子,可能不是好例子,因為原作者說的是濫用,但是可以用來體會eval的功能:)
1)大概意思就是定義一個函數,清理一個嵌套list中的字符串數據,按照對應可以解析的數據類型進行轉換。
正常情況下,大多數人的方法可能是用 try int,float, 加 if 判斷,但是寫起相當麻煩.這里用eval函數實現
起來卻非常省事。
1 def clean_data(data): 2 for sub_list in data: 3 for i in range(len(sub_list)): 4 try: 5 sub_list[i] = eval(sub_list[i]) 6 except SyntaxError: 7 sub_list[i] = None 8 except NameError: 9 pass 10 11 d = [['abc', '123', '45.6', 'True', 'False']] 12 clean_data(d) 13 print(d) 14 15 d = [['ab2'], ['-123'], ['45.6'], ['False', '3.2']] 16 clean_data(d) 17 print(d)
輸出結果:
[['abc', 123, 45.6, True, False]]
[['ab2'], [-123], [45.6], [False, 3.2]]
可以看到, 字符串還是字符串,字符串中包含數字的轉換為數字, 包含布爾值的字符串都變為布爾值.其實就是字符串的表達式化.
如果字符串里面還有一個類名字,例如: 'class_name'
那么使用eval('class_name')()就可以創建一個類的實例. 比如下面代碼
1 >>> class T(object): 2 ... def __init__(self): 3 ... print("hello from T") 4 ... 5 >>> type(eval('T')) 6 <class 'type'> 7 >>> eval('T') 8 <class '__main__.T'> 9 >>> eval('T')() 10 hello from T 11 <__main__.T object at 0x0000016E0D5BCDD8> 12 >>>
