Python內建函數(19)——eval,python內建函數eval

來源:互聯網
上載者:User

Python內建函數(19)——eval,python內建函數eval

英文文檔:

eval( expression, globals=None, locals=None)
The arguments are a string and optional globals and locals. If provided, globals must be a dictionary. If provided, locals can be any mapping object.
The expression argument is parsed and evaluated as a Python expression (technically speaking, a condition list) using the globals and locals dictionaries as global and local namespace. If the globals dictionary is present and lacks ‘__builtins__’, the current globals are copied into globals before expression is parsed. This means that expression normally has full access to the standard builtins module and restricted environments are propagated. If the locals dictionary is omitted it defaults to the globals dictionary. If both dictionaries are omitted, the expression is executed in the environment where eval() is called. The return value is the result of the evaluated expression. Syntax errors are reported as exceptions. Example:
>>> x = 1>>> eval('x+1')2

This function can also be used to execute arbitrary code objects (such as those created by compile()). In this case pass a code object instead of a string. If the code object has been compiled with 'exec' as the mode argument, eval()‘s return value will be None.

Hints: dynamic execution of statements is supported by the exec() function. The globals() and locals() functions returns the current global and local dictionary, respectively, which may be useful to pass around for use by eval() or exec().
See ast.literal_eval() for a function that can safely evaluate strings with expressions containing only literals.
說明:
  
  1. 執行動態語句,返回語句執行的值。
>>> eval('1+2+3+4')10

  2. 第一個參數為語句字串,globals參數和locals參數為選擇性參數,如果提供,globals參數必需是字典,locals參數為mapping對象。

>>> g = {'num':2}>>> eval('num + 2') #num未定義Traceback (most recent call last):  File "<pyshell#3>", line 1, in <module>    eval('num + 2')  File "<string>", line 1, in <module>NameError: name 'num' is not defined>>> eval('num + 2',g) #g中有定義num,可執行4

   4. locals參數用來指定代碼執行時可以使用的局部變數以及收集代碼執行後的局部變數

>>> g = {'num1':2}>>> l = {'num2':4}>>> eval('num1+num2',g,l)6

   5. 為了保證代碼成功運行,globals參數字典不包含 __builtins__ 這個 key 時,Python會自動添加一個key為 __builtins__ ,value為builtins模組的引用。如果確實要限制代碼不使用builtins模組,需要在global添加一個key為__builtins__,value為{}的項即可(很少有人這麼幹吧)。

>>> g = {}>>> eval('abs(-1)',g)1>>> g = {'__builtins__':{}}>>> eval('abs(-1)',g) #不能使用內建函數了Traceback (most recent call last):  File "<pyshell#9>", line 1, in <module>    eval('abs(-1)',g)  File "<string>", line 1, in <module>NameError: name 'abs' is not defined

   6. 當globals參數不提供是,Python預設使用globals()函數返回的字典去調用。當locals參數不提供時,預設使用globals參數去調用。

>>> num = 1>>> eval('num+2')3>>> globals() #返回字典中含有num的key{'__doc__': None, 'num': 1, '__package__': None, '__name__': '__main__', '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__builtins__': <module 'builtins' (built-in)>}>>> eval('num+2',{}) #locals參數未提供,locals參數=globals參數Traceback (most recent call last):  File "<pyshell#3>", line 1, in <module>    eval('num+2',{})  File "<string>", line 1, in <module>NameError: name 'num' is not defined>>> l = locals() >>> eval('num+2',{},l) #locals參數含有num的key,能求值3>>> locals(){'__doc__': None, 'l': {...}, 'num': 1, '__package__': None, '__name__': '__main__', '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__builtins__': <module 'builtins' (built-in)>}>>> 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.