705 votes

Qu'est-ce que le "monkey patch" ?

J'essaie de comprendre cette définition. Est-ce quelque chose comme la surcharge des méthodes/opérateurs ou la délégation ? A-t-elle quelque chose en commun avec ces choses ?

648voto

Daniel Roseman Points 199743

Non, ce n'est pas comme toutes ces choses. Il s'agit simplement du remplacement dynamique d'attributs au moment de l'exécution.

Par exemple, considérons une classe qui possède une méthode get_data . Cette méthode effectue une recherche externe (sur une base de données ou une API web, par exemple), et diverses autres méthodes de la classe l'appellent. Cependant, dans un test unitaire, vous ne voulez pas dépendre de la source de données externe - vous remplacez donc dynamiquement la méthode get_data avec un stub qui renvoie des données fixes.

Comme les classes Python sont mutables et que les méthodes ne sont que des attributs de la classe, vous pouvez le faire autant que vous le souhaitez - et, en fait, vous pouvez même remplacer les classes et les fonctions dans un module exactement de la même manière.

408voto

Guandalino Points 3287

Un MonkeyPatch est un morceau de code Python qui étend ou modifie d'autres d'autres codes au moment de l'exécution (généralement au démarrage).

Un exemple simple ressemble à ceci :

from SomeOtherProduct.SomeModule import SomeClass

def speak(self):
    return "ook ook eee eee eee!"

SomeClass.speak = speak

Source : MonkeyPatch page sur le wiki de Zope.

35voto

David Heffernan Points 292687

Selon Wikipedia :

En Python, le terme patch de singe ne fait que fait référence aux modifications dynamiques d'une classe ou module au moment de l'exécution, motivées par l'intention de corriger le code existant existant d'une tierce partie comme solution de contournement à un problème. bogue ou une fonctionnalité qui ne fonctionne pas comme comme vous le souhaitez.

18voto

Andreas Jung Points 1

Premièrement : le singe Parcheando est un hack maléfique (à mon avis).

Il est souvent utilisé pour remplacer une méthode au niveau du module ou de la classe par une implémentation personnalisée.

Le cas d'utilisation le plus courant est l'ajout d'une solution de contournement pour un bogue dans un module ou une classe lorsque vous ne pouvez pas remplacer le code original. Dans ce cas, vous remplacez le "mauvais" code par un Parcheando de singe avec une implémentation dans votre propre module/package.

14voto

DShook Points 5361

Jeff Atwood a écrit un article à ce sujet.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X