Home  >  Article  >  Backend Development  >  What is monkey patching in Python

What is monkey patching in Python

爱喝马黛茶的安东尼
爱喝马黛茶的安东尼forward
2020-01-04 17:45:503105browse

What is monkey patching in Python

The dynamic replacement of attributes at runtime is called a monkey patch.

Why is it called monkey patch

#The runtime replacement of attributes has nothing to do with monkeys. There are two opinions on the origin of monkey patch found online. :

1. This word was originally Guerrilla Patch, a miscellaneous army and guerrilla army, which means that this part is not original. In English, the pronunciation of guerilla is similar to gollia (orangutan), and later it was written as monkey (monkey). .

2. Another explanation is that because this method messes up the original code (messing with it), it is called monkeying about (naughty) in English, so it is called Monkey Patch.

The name of monkey patch is a bit confusing, as long as it corresponds to the "function of module runtime replacement".

Usage of monkey patch

1. Method of dynamically replacing modules at runtime

stackoverflow There are two popular examples above.

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.

Suppose a class has a method get_data. This method does some external queries (such as querying the database or Web API, etc.), and many other methods in the class call it. However, in a unit test, you don't want to rely on external data sources. So you replace this get_data method with a dumb method state, which just returns some test data.

Another example quoted is the explanation of Monkey Patch on Zope wiki:

from SomeOtherProduct.SomeModule import SomeClass
def speak(self):
    return "ook ook eee eee eee!"
SomeClass.speak = speak

There is also a more practical example. Many codes use import json. Later, it was found that ujson has higher performance. If I feel that it is more expensive to change the import json of each file to import ujson as json, or if I want to test whether replacing json with ujson meets expectations, I only need to add:

import json
import ujson
def monkey_patch_json():
    json.__name__ = 'ujson'
    json.dumps = ujson.dumps
    json.loads = ujson.loads
monkey_patch_json()

2 at the entrance. There are many ways to dynamically add modules at runtime

There are many scenarios like this. For example, if we reference a module in the team's general library and want to enrich the module's functions, in addition to inheritance, we can also consider using Monkey. Patch.

Personally, I feel that while Monkey Patch brings convenience, it also risks messing up the elegance of the source code.

PHP Chinese website has a large number of free Python video tutorials, everyone is welcome to learn!

This article is reproduced from: https://www.jianshu.com/p/a19f936471e4

The above is the detailed content of What is monkey patching in Python. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:jianshu.com. If there is any infringement, please contact admin@php.cn delete