Surcharger les opérateurs "or" et "|" séparément.

a marqué ce sujet comme résolu.

Salut les agrumes,

En essayant de surcharger les opérateurs or et |, j’ai remarqué que la méthode __or__, qui est censée, d’après ce que j’ai pu lire sur internet, surcharger l’opérateur |, surcharge les deux en même temps. D’où la question : y a-t-il un moyen de les surcharger différemment ?

Merci d’avance !

EDIT : Je n’ai rien dit, je viens de me rendre compte que __or__ ne surcharge bien que |. Mais alors, peut-on surcharger or ?

+0 -0

L’opérateur or ne se surcharge pas vraiment. Ce que tu surcharges, c’est surtout |. Si tu veux utiliser tes objets de façon idiomatique avec or c’est plutôt la méthode __bool__ que tu veux surcharger.

+4 -0

Salut,

__or__ ne surcharge pas les deux opérateurs en même temps, non, elle ne sert que pour l’opérateur |.

Il n’y a pas moyen en Python de surcharger and, or et not, qui sont des opérateurs booléens, et n’agissent que sur des booléens ou assimilés.

En fait la raison est "subtile": and et or ont la propriété de n’évaluer le terme de droite que si c’est nécessaire. Regarde la différence dans une console :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
>>> True or sdfsdfsdf
True
>>> True | sdfsdffsd
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'sdfsdffsd' is not defined
>>> False and sdfsdfsdf
False
>>> False & sdfsdfsdf
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'sdfsdfsdf' is not defined

Or il n’existe pas de moyen de reproduire ça en python pur. A l’intérieur d’une fonction python, les arguments qu’elle reçoit sont déjà évalué. Cette machinerie se passe à l’intérieur du coeur de python. Beaucoup de codes jouent là dessus. Permettre leur surcharge casserait ce comportement.

A noter qu’il a été question déjà sur la mailling list de permettre la reception d’arguments non-évalués mais je ne sais pas si ça a bougé. L’intéret semble limité.

+3 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte