42

set我在交互式 python 会话中使用它作为变量名不小心覆盖了 - 有没有什么方法可以在set不重新启动会话的情况下访问原始函数?

(在那次会议上我有很多东西,我宁愿不必这样做,尽管如果必要的话我当然可以。)

4

3 回答 3

71

只需删除掩盖内置的名称:

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

builtins 您仍然可以通过模块访问原始内置(__builtin__在 Python 2 上,带有下划线和 no s);如果您想覆盖内置但仍想从覆盖中推迟到原始版本,请使用此选项:

>>> import builtins
>>> builtins.set
<type 'set'>

如果您无法找到定义掩码名称的位置,请检查从当前名称到内置名称的所有名称空间;请参阅范围规则的简短描述?哪些范围可能适用于您当前的情况。

于 2013-06-17T16:52:20.693 回答
7

您可以使用__builtin__

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

或者简单地说(不需要进口):

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

对于 Python 3

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

来自文档

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

于 2013-06-17T16:51:17.740 回答
0

要使用内置包装器,首先将其原始地址分配给一个变量,例如X

完成工作后,将其设置为None并将原始地址设置回内置函数。

例子

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

    __builtin__.isinstance=None 
    
    __builtin__.isinstance=X 
    
于 2018-06-05T06:39:32.283 回答