【问题标题】:How to restore a builtin that I overwrote by accident?如何恢复我意外覆盖的内置函数?
【发布时间】:2013-06-13 17:11:24
【问题描述】:

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

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

【问题讨论】:

    标签: python built-in


    【解决方案1】:

    只需删除屏蔽内置函数的名称即可:

    >>> 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? 了解适用于您当前情况的范围。

    【讨论】:

    • 在 Python 3 中对我不起作用。我在删除 open 时收到错误消息。
    • @TomášZato:那么您从未在当前命名空间中创建一个名称来掩盖它。没有例子,我不能告诉你更多,也许你想为此创建新问题?请不要假设您有完全相同的情况,请在投票前在新会话中测试您的假设。我在回答中描述的内容与 Python 3 中显示的完全一样
    • 对不起,我确实误解了情况。在我的例子中, open 实际上是通过内置模块替换的,而不仅仅是局部变量的别名。
    • @TomášZato:对,我已经更新了问题,明确指出您需要检查所有范围,包括内置范围。
    【解决方案2】:

    你可以使用__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') 模块并适当修改其属性。

    【讨论】:

    • 那么如果builtins.open的方法被改变了怎么办?
    • @TomášZato 那么据我所知,不可能把它找回来。如果您的应用程序需要执行类似的操作,那么您应该保持对此类变量的完整引用。
    【解决方案3】:

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

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

    例子

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

      __builtin__.isinstance=None 
      
      __builtin__.isinstance=X 
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-24
      • 1970-01-01
      • 2013-04-08
      • 1970-01-01
      • 2021-12-08
      相关资源
      最近更新 更多