Python Overlays : A case for monkey Patching

monkeypatching, python, python-import

Solution

>>> import wrapt
>>> @wrapt.when_imported('collections')
... def hook(collections):
...     OldOrderedDict = collections.OrderedDict
...     class MyOrderedDict(OldOrderedDict):
...         def monkey(self):
...             print('ook ook')
...     collections.OrderedDict = MyOrderedDict
...     
>>> from collections import OrderedDict
>>> OrderedDict().monkey()
ook ook

Problem

I am trying to wrap/monkey patch modules in python. I am trying to develop a a clean means of implementing this that does not interfere with any existing code. Problem Given a script that imports some `CLASS` from a `MODULE` ``` from MODULE import CLASS ``` I would like to replace `MODULE` with another `_MODULE_`. Where `_MODULE_` is a patch for the original `MODULE`. The cleanest interface I can see for this is as follows. ``` from overlay import MODULE # Switches MODULE for _MODULE from MODULE import CLASS # Original import now uses _MODULE_ ``` This is basically monkey patching modules in the same way one would monkey patch classes, functions and methods. I believe if this is done correctly one could consistently patch code in a project specific kind of way. What is the best way of implementing this ?

Original source