How to restore a builtin that I overwrote by accident?

本秂侑毒 提交于 2019-12-03 09:36:46
Martijn Pieters

Just delete the name that is masking the builtin:

>>> set = 'oops'
>>> set
'oops'
>>> del set
>>> set
<type 'set'>

You can always still access the original built-in through the __builtins__ namespace; use this if you want to override the built-in but want to defer to the original still from the override:

>>> __builtins__.set
<type 'set'>

__builtins__ is sourced from the __builtin__ module (Python 2, note the lack of s), or the builtins module (Python 3, with s but no underscores).

If you have trouble locating where the masking name is defined, do check all namespaces from your current one up to the built-ins; see Short Description of the Scoping Rules? for what scopes may apply to your current situation.

You can use __builtin__:

>>> import __builtin__
>>> __builtin__.set
<type 'set'>

or simply(no imports required):

>>> __builtins__.set
<type 'set'>

For Python 3:

>>> import builtins
>>> builtins.set
<class 'set'>

From docs:

CPython implementation detail: Users should not touch __builtins__; it is strictly an implementation detail. Users wanting to override values in the builtins namespace should import the __builtin__ (no ‘s’) module and modify its attributes appropriately.

Sagar

To use builtin wrapper, first assign its original address in a variable like X

After your work is done then set it to None and set back the original address to builtin function.

Example

  1. X= __builtin__.isinstance
  2. __builtin__.isinstance = myininstance
  3. work is done

    __builtin__.isinstance=None 
    
    __builtin__.isinstance=X 
    
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!