Python內置函數——eval

英文文檔:

eval (expressionglobals=Nonelocals=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 modeargument, eval()‘s return value will be None.shell

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對象。express

  3. globals參數用來指定代碼執行時可使用的全局變量以及收集代碼執行後的全局變量。app

複製代碼
>>> 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參數用來指定代碼執行時可使用的局部變量以及收集代碼執行後的局部變量ide

>>> 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參數去調用。post

複製代碼
>>> 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)>}
>>> 
複製代碼
相關文章
相關標籤/搜索