2009-07-24 6 views
4

d'abord le code:comparaison des types différents en python

class myClass(object): 
    def __cmp__(self, other): 
     return cmp(type(self), type(other)) or cmp(self.__something, other.__something) 

Est-ce que ce type de production le même ordre que pour les autres types en python? Existe-t-il un idiome correct pour cela?

Related question:

Un peu de regarder autour sur google je trouve des informations pertinentes dans le python docs. Citant:

Note de mise en œuvre: objets de différents types, à l'exception des numéros sont commandés par leurs noms de type; les objets des mêmes types qui ne supportent pas sont comparés par leur adresse .

Cela suggère que si je veux suivre ce comportement, je devrais utiliser

class myClass(object): 
    def __cmp__(self, other): 
     return (cmp(self.__class__.__name__, other.__class__.__name) or 
       cmp(self.__something, other.__something)) 

particulièrement regrettable est que je puisse avoir un mantaining temps extraordinairement difficile transitivité avec dict s, ce qui est un cas particulier I avait espéré mettre en œuvre. Est-ce que j'ai même besoin de vérifier les types de mes arguments? est-ce que python me laisse même voir ça?

+0

Pouvez-vous élaborer la question. Que voulez-vous dire par «produire le même ordre que pour les autres types en python»? –

+0

Notez que cmp (dict(), str()) est différent de zéro. Je voudrais maintenir la transitivité avec mon type par rapport aux types prédéfinis, mais je ne suis pas sûr de savoir comment le faire. – SingleNegationElimination

Répondre

1

Python 2 a malheureusement supporté de telles comparaisons "alien" (heureusement abrogées dans Python 3). Il n'est PAS facile d'émuler le comportement des built-ins car il a tellement de cas spéciaux, par exemple float et int compare directement (pas de substitution de type de comparaison puisque vous l'avez codé) mais complexe fait toute comparaison (sauf == et! =) toujours lever une exception. Avez-vous vraiment besoin d'émuler toutes ces bizarreries et se trémousse? Un tel besoin serait très inhabituel. Si votre type est "numérique" (par exemple, regardez decimal.Decimal), il doit être sympa avec d'autres types numériques, mais les types qui ne sont pas des "nombres comparables" ont moins de contraintes sensibles en mots réels ...!

0

Qu'essayez-vous vraiment de faire? Pourquoi voudriez-vous trier ou comparer des instances de classes différentes par classe/type?

Il est difficile de proposer une solution lorsque vous n'avez pas réellement signalé le problème.

Vous devez définir vos propres méthodes de comparaison pour les classes personnalisées, et c'est en grande partie à vous de vous assurer que toutes les comparaisons que vous effectuez ont du sens.

Veuillez expliquer ce que vous tentez d'accomplir. Ce n'est peut-être pas la façon Pythonienne.

Questions connexes