Python中eval的使用


       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 >>>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM