Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Undo Overwrite of Python Built-In

In Python there are several built-in functions. Take open for example open. I can fire up a Python console and get some info about open by doing the following:

>> open    
>>(built-in function open)

But if I were to do something like this:

>> # I know it's bad practice to import all items from the namespace    
>> from gzip import *    
>> open    
>>(function open at 0x26E88F0)

It appears that, for the rest of my console session, all calls to the open function will not use the built-in function but the one in the gzip module. Is there any way to redefine a built-in function in Python back to the original? It's easy if I have a reference to the desired function, like below:

def MyOpen(path):
  print('Trivial example')

open = MyOpen

How do you obtain a reference for built-in functions once those references have been overwritten?

like image 797
Joel B Avatar asked Mar 06 '15 16:03

Joel B


People also ask

How do you stop overwrite names in Python?

You can't. You could use linters (e.g. pylint ) which will check for this kind of thing, but Python allows you to reuse anything except a keyword or None .

How do you override a built in method in Python?

In Python method overriding occurs simply defining in the child class a method with the same name of a method in the parent class. When you define a method in the object you make the latter able to satisfy that method call, so the implementations of its ancestors do not come in play.

How do you reset a function in Python?

Calling the start() function on a terminated process will result in an AssertionError indicating that the process can only be started once. Instead, to restart a process in Python, you must create a new instance of the process with the same configuration and then call the start() function.

Does Python overwrite variables?

In Python, a string is immutable. You cannot overwrite the values of immutable objects. However, you can assign the variable again. It's not modifying the string object; it's creating a new string object.


1 Answers

You can simply delete the global:

del open

or you can import the __builtin__ module (Python 2) or builtins module (Python 3) to get to the original:

import __builtin__

__builtin__.open

Name lookups go first to your global namespace, then to the built-ins namespace; if you delete the global name open it'll no longer be in the way and the name lookup progresses to the built-ins namespace, or you can access that namespace directly via the imported module.

like image 171
Martijn Pieters Avatar answered Sep 28 '22 07:09

Martijn Pieters