【发布时间】:2013-06-13 17:11:24
【问题描述】:
我不小心将set 用作交互式python 会话中的变量名覆盖了它——有什么方法可以让我在不重新启动会话的情况下访问原始set 函数?
(我在那个会话中有很多东西,我宁愿不必这样做,尽管如果必要的话我当然可以。)
【问题讨论】:
我不小心将set 用作交互式python 会话中的变量名覆盖了它——有什么方法可以让我在不重新启动会话的情况下访问原始set 函数?
(我在那个会话中有很多东西,我宁愿不必这样做,尽管如果必要的话我当然可以。)
【问题讨论】:
只需删除屏蔽内置函数的名称即可:
>>> set = 'oops'
>>> set
'oops'
>>> del set
>>> set
<type 'set'>
您仍然可以通过builtins 模块访问原始内置模块(Python 2 上的__builtin__,带有下划线,没有s);如果您想覆盖内置但仍想从覆盖中推迟到原始版本,请使用此选项:
>>> import builtins
>>> builtins.set
<type 'set'>
如果您无法找到定义掩码名称的位置,请检查从当前名称到内置名称的所有名称空间;请参阅 Short description of the scoping rules? 了解适用于您当前情况的范围。
【讨论】:
open 时收到错误消息。
你可以使用__builtin__:
>>> import __builtin__
>>> __builtin__.set
<type 'set'>
或者简单地说(不需要导入):
>>> __builtins__.set
<type 'set'>
>>> import builtins
>>> builtins.set
<class 'set'>
来自docs:
CPython 实现细节:用户不应触碰
__builtins__;它 严格来说是一个实现细节。想要覆盖值的用户 在builtins命名空间中应该导入__builtin__(没有's') 模块并适当修改其属性。
【讨论】:
builtins.open的方法被改变了怎么办?
要使用内置包装器,首先将其原始地址分配到一个变量中,例如X
工作完成后,将其设置为None,并将原始地址设置回内置函数。
例子
X= __builtin__.isinstance__builtin__.isinstance = myininstance 工作完成
__builtin__.isinstance=None
__builtin__.isinstance=X
【讨论】: