9
votes

Quelle est la mauvaise utilisation d'une méthode d'un module tiers?

Quelle est la faute de redéfinir une méthode de classe d'un autre module tiers, à Python?

En fait, les utilisateurs peuvent créer des matrices numpues contenant numéros avec incertitude ; Idéalement, je voudrais que leur code soit non modifié (comparé au moment où le code manipule des matrices de flotteur); En particulier, ce serait génial si l'inverse de la matrice m pourrait toujours être obtenu avec MI , malgré le fait que MI doit être calculé Avec mon propre code (la méthode d'origine i ne fonctionne pas, en général).

Comment c'est mauvais pour redéfinir Numpy.Matrix.i? Pour une chose, il aligne le code tiers que je n'aime pas, car il peut ne pas être robuste (que si d'autres modules font la même chose? ...). Un autre problème est que le nouveau numpy.matrix.i est un wrapper qui implique une petite surcharge lorsque l'original numpy.matrix.i peut être appliqué pour obtenir la matrice inverse.

est de sous-classement des matrices numpues et ne change que la méthode i mieux? Cela obligerait les utilisateurs à mettre à jour leur code et à créer des matrices de chiffres avec incertitude avec m = matrix_with_uncert (...) (au lieu de continuer à utiliser numpy.matrix (...) , comme pour une matrice de flotteurs), mais ceci est peut-être un inconvénient qui devrait être accepté pour le bien de la robustesse? Les inversions matricielles pourraient toujours être effectuées avec MI , ce qui est bon ... D'autre part, ce serait bien que les utilisateurs puissent construire toutes leurs matrices (de flotteurs ou de nombres avec incertitudes) avec numpy .Matrix () directement, sans avoir à la perfectionner de vérifier les types de données.

Tout commentaire ou une approche supplémentaire serait la bienvenue!


0 commentaires

3 Réponses :


1
votes

En général, il est parfaitement acceptable de remplacer les méthodes qui sont ...

  • autorisation intentionnellement remplace
  • d'une manière qu'ils documentent (satisfaisant LSP ne fera pas mal)

    Si les deux conditions sont remplies, alors le dépassement devrait être en sécurité.


0 commentaires

1
votes

dépend de ce que vous voulez dire avec "redéfinir". Évidemment, vous pouvez utiliser votre propre version de celui-ci, aucun problème du tout. Vous pouvez également redéfinir le sous-classement s'il s'agit d'une méthode.

Vous pouvez également faire une nouvelle méthode et la corriger dans la classe, une pratique appelée monkey_ppatching. Comme: xxx

Cela fera toutes les instances d'aclass Utilisez votre nouvelle fonction au lieu de l'ancien, y compris des instances dans les modules "de quatrième partie". Cela fonctionne et est très utile, mais il est considéré comme une option très laid et une dernière station. En effet, rien dans le code ACLASS ne suggère que vous avez remplacé la méthode, il est donc difficile de déboguer. Et encore pire, il obtient lorsque deux modules monkeychent la même chose. Ensuite, vous vraiment êtes confus.


0 commentaires

11
votes

Le sous-classement (qui consiste à remplacer, car le terme est généralement utilisé) est généralement très préférable à "patching singe" (des méthodes altérées de la farce dans des classes ou des modules existants), même lorsque ce dernier est disponible (types intégrés, Cela signifie que ceux mis en œuvre dans C, peuvent se protéger contre le correcteur de singe et la plupart d'entre eux le font).

Par exemple, si votre fonctionnalité s'appuie sur la correction de singe, elle brisera et arrêtera les mises à niveau si, à tout moment, la classe de la classe de singe est mise à niveau pour être mise en œuvre dans C (pour la vitesse ou spécifiquement pour défendre contre la correction de singe) . Les mainteneurs de paquets tiers hainent le singe-patchs, car cela signifie qu'ils obtiennent de faux rapports de bugs d'utilisateurs hachés qui (à l'insu d'eux) utilisent en fait une buggy singe-patch qui brise le paquet tiers, où ces derniers (à moins que le singe cassé sage) est sans faille. Vous avez déjà fait remarquer sur la performance possible.

Conceptuellement, une "matrice de nombres avec incertitude" est un concept différent d'une "matrice de nombres". Le sous-classement exprime ceci proprement, le dosage de singe essaie de le cacher. C'est vraiment la racine de ce qui ne va pas avec la correction de singe en général: un canal secret fonctionnant à travers des moyens globaux et cachés, sans clarté et transparence. Tous les nombreux problèmes pratiques descendent dans un sens de ce problème conceptuel racine.

i fortement vous exhortez de rejeter la correction de singe en faveur de solutions propres telles que le sous-classement.


1 commentaires

Merci pour cette description lucide du patch de singe et de ses problèmes potentiels! Je dois dire que NUMPY encourage la définition de "réseaux de quelque chose" en leur soutenant ( numpy.array ([Any_Object]) ). Donc, je dirais que "les matrices de tout type d'objet" est un concept très supporté par NUMPY-ELEMENT-SIQUER ADDY est automatiquement supporté, etc., disait, je m'abonne entièrement au reste de votre réponse!