撤消 Python 内置的覆盖
Undo Overwrite of Python Built-In
在Python中有几个built-in functions。以open为例open
。我可以通过执行以下操作启动 Python 控制台并获取有关 open
的一些信息:
>> open
>>(built-in function open)
但是如果我这样做的话:
>> # I know it's bad practice to import all items from the namespace
>> from gzip import *
>> open
>>(function open at 0x26E88F0)
看来,在我的控制台会话的其余部分,对 open
函数的所有调用都不会使用内置函数,而是使用 gzip
模块中的函数。有什么方法可以将 Python 中的内置函数重新定义回原始函数吗?如果我有对所需功能的引用,这很容易,如下所示:
def MyOpen(path):
print('Trivial example')
open = MyOpen
一旦这些引用被覆盖,您如何获得对内置函数的引用?
您可以简单地删除全局:
del open
或者您可以导入 __builtin__
module (Python 2) or builtins
module (Python 3) 以获得原始的:
import __builtin__
__builtin__.open
名称查找首先到您的全局命名空间,然后到内置命名空间;如果您删除全局名称 open
,它将不再妨碍并且名称查找会进入内置命名空间,或者您可以直接通过导入的模块访问该命名空间。
在Python中有几个built-in functions。以open为例open
。我可以通过执行以下操作启动 Python 控制台并获取有关 open
的一些信息:
>> open
>>(built-in function open)
但是如果我这样做的话:
>> # I know it's bad practice to import all items from the namespace
>> from gzip import *
>> open
>>(function open at 0x26E88F0)
看来,在我的控制台会话的其余部分,对 open
函数的所有调用都不会使用内置函数,而是使用 gzip
模块中的函数。有什么方法可以将 Python 中的内置函数重新定义回原始函数吗?如果我有对所需功能的引用,这很容易,如下所示:
def MyOpen(path):
print('Trivial example')
open = MyOpen
一旦这些引用被覆盖,您如何获得对内置函数的引用?
您可以简单地删除全局:
del open
或者您可以导入 __builtin__
module (Python 2) or builtins
module (Python 3) 以获得原始的:
import __builtin__
__builtin__.open
名称查找首先到您的全局命名空间,然后到内置命名空间;如果您删除全局名称 open
,它将不再妨碍并且名称查找会进入内置命名空间,或者您可以直接通过导入的模块访问该命名空间。