patternpythonCriticalCanonical
What is monkey patching?
Viewed 0 times
whatpatchingmonkey
Problem
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?
Is that something like methods/operators overloading or delegating?
Does it have anything common with these things?
Solution
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
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
-
If some variable or attribute exists that also points to the
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 original get_data. (Why? Python just rebinds the name get_data in your class to some other function object; other name bindings are not impacted at all.)Context
Stack Overflow Q#5626193, score: 828
Revisions (0)
No revisions yet.