I am trying to understand, what is monkey patching or a monkey patch?
Is that something like methods/operators overloading or delegating?
Does it have anything common with these things?
8 s
No, it’s not like any of those things. It’s simply the dynamic replacement of attributes at runtime.
For instance, consider a class that has a method get_data
. This method does an external lookup (on a database or web API, for example), and various other methods in the class call it. However, in a unit test, you don’t want to depend on the external data source – so you dynamically replace the get_data
method with a stub that returns some fixed data.
Because Python classes are mutable, and methods are just attributes of the class, you can do this as much as you like – and, in fact, you can even replace classes and functions in a module in exactly the same way.
But, as a commenter pointed out, use caution when monkeypatching:
-
If anything else besides your test logic calls
get_data
as well, it will also call your monkey-patched replacement rather than the original — which can be good or bad. Just beware. -
If some variable or attribute exists that also points to the
get_data
function by the time you replace it, this alias will not change its meaning and will continue to point to the originalget_data
. (Why? Python just rebinds the nameget_data
in your class to some other function object; other name bindings are not impacted at all.)