Monkey patching en Python

monkey-patch-christian

Un parche de mono es la técnica que le permite a un programa extender o modificar localmente el software del sistema de soporte, según Wikipedia.  

En otras palabras, un parche del mono permite ajustar interfaces y comportamientos de clases y objetos en tiempo de ejecución.

En ese sentido, el parche del mono facilita el soporte de problemas relacionados con los cambios de API entre bibliotecas.

Un ejemplo para entender el tipo de soporte que ofrece un parche del mono, sería:

Usar pyppeteer en Python 3.5.2 no es compatible, porque el módulo de typings no contiene la clase Coroutine. 

Por lo anterior, necesitamos ejecutar la aplicación en varios servidores para configurar Python a una versión diferente a la predeterminada o parchearla para admitir la versión que tenemos.

El error es simple y lo encontramos en el github de pypeteer.

Sin embargo, en pypi podemos encontrar un módulo que proporciona las definiciones de las clases que faltan: typing extensions.

Cabe mencionar, que a pesar de que más tarde se agregó la opción anterior, por lo que Python 3.5.6 lo admite, ubuntu 16 solo se envía con Python 3.5.2 de forma predeterminada. 

En resumen, la idea detrás del parche mono es modificar módulos en tiempo de ejecución. Parchear todo a medida que se avanza para asegurar de que todo esté en el estado ideal.

En este caso específico inyectamos la clase Coroutine con un código sencillo: 

probar: 
    desde el lanzamiento de importación de pyppeteer 
excepto ImportError: 
    de escribir_extensiones importar Coroutine 
    escribiendo.Corrutina = Corrutina 
    desde el lanzamiento de importación de pyppeteer

Si  importamos el módulo que no es compatible con Python 3.5.2, fallará, pero sí al detectar el error,  colocamos la clase que necesitamos dentro del módulo de digitación, obtendremos el resultado deseado con su componente definido.

¿Cuándo usar el parche del mono? 

La técnica del parche del mono puede verse como algo «hacky» y podemos evitarla siempre que sea posible. Sin embargo, hay casos válidos en los que un simple parche mono ahorra tiempo y esfuerzo.

El parche mono es otra herramienta útil para cuando un problema emerja… ¡úsala sabiamente!