89 votes

Python : définir mes propres opérateurs ?

Je voudrais définir mon propre opérateur. Est-ce que python supporte une telle chose ?

196voto

Ayman Hourieh Points 39435

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

47voto

dfa Points 54490

Python est livré avec un système prédéfini, mais qui peut être modifié, ensemble d'opérateurs .

42voto

Zifre Points 14109

Non, vous ne pouvez pas créer de nouveaux opérateurs. Toutefois, si vous vous contentez d'évaluer des expressions, vous pouvez traiter la chaîne vous-même et calculer les résultats des nouveaux opérateurs.

13voto

billyjmc Points 43

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.

12voto

Giulio Ghirardo Points 3742

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.

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