Je voudrais définir mon propre opérateur. Est-ce que python supporte une telle chose ?
Réponses
Trop de publicités?Bien que techniquement vous ne pouvez pas définir de nouveaux opérateurs dans Python, ce hack intelligent fonctionne autour de cette limitation. Il vous permet de définir des opérateurs d'infixe comme ceci :
# simple multiplication
x=Infix(lambda x,y: x*y)
print 2 |x| 4
# => 8
# class checking
isa=Infix(lambda x,y: x.__class__==y.__class__)
print [1,2,3] |isa| []
print [1,2,3] <<isa>> []
# => True
Python est livré avec un système prédéfini, mais qui peut être modifié, ensemble d'opérateurs .
Sage fournit cette fonctionnalité, essentiellement en utilisant le "hack intelligent" décrit par @Ayman Hourieh, mais incorporé dans un module comme un décorateur pour donner une apparence plus propre et une fonctionnalité supplémentaire - vous pouvez choisir l'opérateur à surcharger et donc l'ordre d'évaluation.
from sage.misc.decorators import infix_operator
@infix_operator('multiply')
def dot(a,b):
return a.dot_product(b)
u=vector([1,2,3])
v=vector([5,4,3])
print(u *dot* v)
# => 22
@infix_operator('or')
def plus(x,y):
return x*y
print(2 |plus| 4)
# => 6
Voir la documentation Sage y ce ticket de suivi des améliorations pour plus d'informations.
Python 3.5 introduit le symbole @
pour un opérateur supplémentaire.
PEP465 a introduit ce nouvel opérateur pour la multiplication des matrices, afin de simplifier la notation de nombreux codes numériques. L'opérateur ne sera pas implémenté pour tous les types, mais seulement pour les objets de type tableau.
Vous pouvez prendre en charge l'opérateur pour vos classes/objets en implémentant la fonction __matmul__()
.
Le PEP laisse de la place pour une utilisation différente de l'opérateur pour les objets qui ne sont pas des tableaux.
Bien sûr, vous pouvez mettre en œuvre avec @
toute sorte d'opération différente de la multiplication matricielle également pour les objets de type tableau, mais l'expérience utilisateur sera affectée, car tout le monde s'attendra à ce que votre type de données se comporte d'une manière différente.
- Réponses précédentes
- Plus de réponses