¿Qué es el parcheo de monos en Python?
El reemplazo dinámico de atributos en tiempo de ejecución se denomina parche mono.
¿Por qué se llama parcheo de monos?
El reemplazo de atributos en tiempo de ejecución no tiene nada que ver con los monos. Hay dos teorías encontradas en línea sobre el origen del parcheo de monos:
1. Esta palabra originalmente era Guerrilla Patch, un ejército misceláneo y ejército guerrillero, lo que demuestra que esta parte no es original. En inglés, la pronunciación de guerrilla es similar a gollia (gorila), y luego se escribió mono (. mono).
2. Otra explicación es que debido a que este método estropea el código original (jugándolo), en inglés se llama mono (travieso), por eso se llama Monkey Patch.
El nombre de Monkey Patch es un poco confuso, siempre y cuando corresponda a la "función de reemplazo del tiempo de ejecución del módulo".
Uso del parche mono
1. Método para reemplazar módulos dinámicamente en tiempo de ejecución
Hay dos ejemplos populares en stackoverflow,
considere. una clase que tiene un método get_data. Este método realiza una búsqueda externa (en una base de datos o API web, por ejemplo) y varios otros métodos de la clase lo llaman. Sin embargo, en una prueba unitaria, no
desea depender de la fuente de datos externa, por lo que reemplaza dinámicamente el método get_data con un código auxiliar que devuelve algunos datos fijos. Supongamos que una clase tiene un método get_data. Este método realiza algunas consultas externas (como consultar la base de datos o la API web, etc.) y muchos otros métodos de la clase lo llaman. Sin embargo, en una prueba unitaria, no conviene depender de fuentes de datos externas. Entonces reemplazas este método get_data con un estado de método tonto, que simplemente devuelve algunos datos de prueba.
Otro ejemplo se cita de la explicación de Monkey Patch en la wiki de Zope:
de SomeOtherProduct.SomeModule import SomeClass
def hablar(self):
return "ook ook eee eee eee!"
SomeClass.speak = hablar También hay un ejemplo más práctico. Muchos códigos usan import json. Más tarde descubrí que ujson tiene un mayor rendimiento. Siento que es más costoso cambiar el json de importación de cada archivo para importar ujson como json, o si quieres probar si reemplazar json con ujson es como se esperaba, solo necesitas agregar:
importar json
importar ujson
def mono_patch_json():
json.__name__ = 'ujson'
json.dumps = ujson.dumps
json.loads = ujson.loads
monkey_patch_json() 2. Método para agregar módulos dinámicamente en tiempo de ejecución
Existen muchos escenarios de este tipo, por ejemplo, citamos. uno del módulo de biblioteca general del equipo, y si desea enriquecer las funciones del módulo, también puede considerar usar Monkey Patch además de la herencia.
Personalmente, creo que si bien Monkey Patch aporta comodidad, también corre el riesgo de estropear la elegancia del código fuente.
El sitio web chino de PHP tiene una gran cantidad de tutoriales en video gratuitos sobre Python. ¡Todos son bienvenidos a aprender!
Este artículo está reproducido de: /p/a19f936471e4