如何恢复我意外覆盖的内置?

时间:2013-06-17 16:50:20

标签: python built-in

我在交互式python会话中使用它作为变量名称意外覆盖了set - 有没有什么方法可以访问原始set函数而不只是重新启动会话?

(我在那个会话中有很多东西,我宁愿不必这样做,虽然我当然可以在必要的时候。)

3 个答案:

答案 0 :(得分:39)

只需删除屏蔽内置的名称:

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

您始终可以通过__builtins__命名空间访问原始内置内容;如果要覆盖内置但想要从覆盖中推迟原始静止,请使用此选项:

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

__builtins__来自__builtin__ module(Python 2,请注意缺少s)或builtins module(Python 3,s但来自没有下划线)。

如果您无法找到定义屏蔽名称的位置,请检查当前命名空间到内置插件的所有命名空间;请参阅Short Description of the Scoping Rules?了解适用于您当前情况的范围。

答案 1 :(得分:6)

您可以使用__builtin__

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

或简单(不需要导入):

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

For Python 3

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

来自docs

  

CPython实施细节:用户不应触及__builtins__;它   严格来说是一个实现细节。想要覆盖值的用户   在builtins命名空间中应导入__builtin__(否's')   模块并适当地修改其属性。

答案 2 :(得分:0)

要使用内置包装器,请先在X

之类的变量中指定原始地址

完成工作后,将其设置为None并将原始地址设置为内置功能。

示例

  1. X= __builtin__.isinstance
  2. __builtin__.isinstance = myininstance
  3. 工作已完成

    __builtin__.isinstance=None 
    
    __builtin__.isinstance=X