web-dev-qa-db-fra.com

Python: définir mes propres opérateurs?

Je voudrais définir mon propre opérateur. python supporte-t-il une telle chose?

65
cwj

Non, vous ne pouvez pas créer de nouveaux opérateurs. Cependant, si vous évaluez simplement des expressions, vous pouvez traiter la chaîne vous-même et calculer les résultats des nouveaux opérateurs.

31
Zifre

Bien que techniquement vous ne puissiez pas définir de nouveaux opérateurs en Python, ce hack intelligent contourne cette limitation. Il vous permet de définir des opérateurs infixes 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
159
Ayman Hourieh

Non, Python est livré avec un prédéfini, mais redéfinissable, ensemble d'opérateurs .

40
dfa

Si vous avez l'intention d'appliquer l'opération à une classe particulière d'objets, vous pouvez simplement remplacer l'opérateur qui correspond le mieux à votre fonction ... par exemple, remplacer __eq__() remplacera == opérateur pour retourner ce que vous voulez. Cela fonctionne pour presque tous les opérateurs.

9
Sudhir Jonathan

Sage fournit cette fonctionnalité, en utilisant essentiellement le "hack intelligent" décrit par @Ayman Hourieh, mais incorporé dans un module en tant que décorateur pour donner une apparence plus propre et des fonctionnalités supplémentaires - 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 de Sage et ce ticket de suivi des améliorations pour plus d'informations.

8
billyjmc

Python 3.5 introduit le symbole @ Pour un opérateur supplémentaire.

PEP465 a introduit ce nouvel opérateur de multiplication matricielle, pour simplifier la notation de nombreux codes numériques. L'opérateur ne sera pas implémenté pour tous les types, mais uniquement pour les objets de type tableau.

Vous pouvez prendre en charge l'opérateur pour vos classes/objets en implémentant __matmul__().

Le PEP laisse de l'espace pour une utilisation différente de l'opérateur pour les objets qui ne sont pas de type tableau.

Bien sûr, vous pouvez implémenter avec @ Toute sorte d'opération différente de la multiplication matricielle également pour les objets de type tableaux, mais l'expérience utilisateur sera affectée, car tout le monde s'attendra à ce que votre type de données se comporte de manière différente.

7
gg349