a fonction générique est expédiée en fonction du type de tous ses arguments. Le programmeur définit plusieurs implémentations d'une fonction. Le bon est choisi lors du temps d'appel en fonction des types de ses arguments. Ceci est utile pour l'adaptation d'objet entre autres choses. Python a quelques fonctions génériques, y compris Ces paquets ont tendance à autoriser le code qui ressemble à ceci: p> len () code>. class WebComponentUserAdapter(object):
def __init__(self, guest):
self.guest = guest
def canDoSomething(self):
return guest.member_of("something_group")
@when(my.webframework.User)
componentNeedsAUser(user):
return WebComponentUserAdapter(user)
3 Réponses :
Je recommanderais le règles de pointe bibliothèque par P. EBY. Par le même auteur (déprécis cependant) est le package rancaDispatch (le prédécesseur des règles de pointe). Ce dernier n'étant plus maintenu IIRC.
Les règles de pointe ont beaucoup de bonnes caractéristiques, une étant que c'est (bien, pas facilement, mais) extensible. Outre "Classic" Dispatch sur les types SINY, il présente une expédition sur des expressions arbitraires comme "tuteurs". P>
La fonction Notez également que ceci est une seule envoi que, c'est-à-dire le récepteur réel ( est toujours une fonction à une seule disposition, car seul le récepteur est utilisé lorsque la méthode à appelée est résolue. Les arguments restants sont simplement passés, mais ils n'affectent pas la sélection de la méthode. p> Ceci est différent de plusieurs envisages, où il n'y a pas de récepteur dédié, et tous les arguments sont utilisés afin de trouver la mise en œuvre de la méthode réelle à appeler. C'est ce qui rend effectivement la peine de choses en vigueur. Si ce n'était qu'un peu étrange de sucre syntaxique, personne ne se soucierait de l'utiliser, imho. P> dans cet exemple, un appel comme p> considère les arguments forts> pour décider, quelle méthode doit être appelée. p> pour un beau scénario d'utilisation de fonctions génériques à Python je recommanderais Lecture du code refactored du len () code> n'est pas une vraie fonction générique (au moins dans le Sens des paquets mentionnés ci-dessus, ainsi que dans le sens, ce terme est utilisé dans des langues comme Common Lisp , dylan ou < un href = "http://www.cs.washington.edu/research/projects/cecil/www/cecil.html" rel = "noreferrer"> Cecil ), car il s'agit simplement d'une syntaxe pratique pour un Appelez à la méthode spécialement nommée (mais sinon régulière): p> S S S Le code> dans le code ci-dessus) détermine la mise en oeuvre de la méthode appelée. Et même une hypothétique p> pic.security code> A> qui donne une solution très élégante pour accéder à la vérification des autorisations à l'aide de fonctions génériques (à l'aide de rancaSpatch code>). p> p>
AFAIK Ceci est une implémentation assez simple, qui n'appartient que l'expédition de type. Je ne l'ai pas vraiment regardé, alors je ne peux rien dire à ce sujet. Mes expériences sont principalement avec rancaDispatch code> et son successeur.
SimpleGeneric est beaucoup plus simple, mais je pense, pas aussi activement entretenu que le pic plus complexe et plus riche.
Vous pouvez utiliser une construction comme ceci:
def my_func(*args, **kwargs):
pass
Cela n'a pas de sens dans le contexte de la question révisée.
Je ne peux pas voir le point dans ces fonctions "génériques". Cela ressemble à un polymorphisme simple.
Vos fonctionnalités "génériques" peuvent être implémentées comme ceci sans recourir à une identification de type d'exécution. p>
Votre approche n'autorise pas les appels à Dumbexample (1) code> selon les spécifications de l'OP (et que tous les packages de fonction génériques autorisent) - Vous avez besoin d'emballage encombrant sur chacun appel, typiquement avec commutation en fonction des types. (eep). Mais le polymorphisme basé sur un type est toujours approximativement correct: où les collaborateurs classiques et les fonctions génériques (comme dans les Lisp commun, Dylan, ...) véritablement brillent consiste à expédier en fonction de plusieurs types d'arguments (en évitant les klutzes tels que les visiteurs, < B> RADD B> VS Ajoutez B>, et une zillion d'autres halflons OOP a besoin là-bas).
@Alex Martelli: et, vraisemblablement, évitant les problèmes de forice et les problèmes à double envoi. La question de l'OP - et l'exemple - n'a touché aucun de cela. Je ne suis toujours pas clair sur la question vraie i>. Ou peut-être la question était juste hypothétique.
La fonction
len code> appelle simplement la méthode__ len __ code> d'un objet. Est-ce ce que vous entendez par la fonction "générique"? Si tel est le cas, il y a relativement peu de fonctions qui se comportent comme ceci. Avez-vous quelque chose d'autre en tête? Si oui, veuillez choisir un meilleur exemple.Parlez-vous du polymorphisme? Ou parlez-vous de types de singe-patchs de type existant pour ajouter du polymorphisme?
On dirait que (basé sur le? et le lien Wikipedia fourni) Joeforker cherche à mettre en œuvre des fonctions surchargées. Je crois qu'il fait référence à "générique" dans le sens où la fonction est appelée par 1 nom, mais exécute un code différent en fonction des paramètres transmis. Ainsi: my_function (a) -> exécuté fonction_a my_function (b) -> exécuter fonction_b C'est une implémentation plus élégante de l'analyse des ** kwargs pour obtenir quel code exécuter