9 votes

Puis-je faire en sorte que Python lève une exception lorsqu'il compare des types de données différents ?

Disons que je veux comparer 2 variables avec des types de données différents : string et int. Je l'ai testé dans Python 2.7.3 et Python 3.2.3 et aucun des deux ne lève d'exception. Le résultat de la comparaison est False . Puis-je configurer ou exécuter Python avec différentes options pour lancer une exception dans ce cas ?

ks@ks-P35-DS3P:~$ python2
Python 2.7.3 (default, Aug  1 2012, 05:14:39) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> a="123"
>>> b=123
>>> a==b
False
>>> 
ks@ks-P35-DS3P:~$ python3
Python 3.2.3 (default, Apr 12 2012, 19:08:59) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> a="123"
>>> b=123
>>> a==b
False
>>> 
ks@ks-P35-DS3P:~$

7voto

Martijn Pieters Points 271458

Non, vous ne pouvez pas. Les éléments ne sont tout simplement pas égaux, il n'y a pas d'erreur.

D'une manière générale, il s'agit unpythonique pour forcer votre code à n'accepter que des types spécifiques. Que se passerait-il si vous vouliez créer une sous-classe de la classe int et qu'il fonctionne partout où il y a un int fonctionne ? Le type booléen de Python est une sous-classe de int , par exemple ( True == 1, False == 0).

Si vous avez besoin d'une exception, vous pouvez faire l'une des deux choses suivantes :

  1. Testez l'égalité de leurs types et levez vous-même une exception :

    if not isinstance(a, type(b)) and not isinstance(b, type(a)):
        raise TypeError('Not the same type')
    if a == b:
        # ...

    Cet exemple permet à a ou b d'être une sous-classe de l'autre type, vous devrez restreindre le champ d'application si nécessaire ( type(a) is type(b) pour être très strict).

  2. Essayez de commande les types :

    if not a < b and not a > b:
        # ...

    Dans Python 3, une exception est levée lors de la comparaison de types numériques avec des types de séquences (tels que les chaînes de caractères). Les comparaisons réussissent dans Python 2.

    Démonstration de Python 3 :

    >>> a, b = 1, '1'
    >>> not a < b and not a > b
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: unorderable types: int() < str()
    >>> a, b = 1, 1
    >>> not a < b and not a > b
    True

1voto

Russell Borogove Points 8423

Je n'arrive pas à trouver un moyen d'y parvenir qui ne soit pas trop laid pour être utilisé en routine. C'est un cas où le programmeur Python doit faire attention aux types de données sans l'aide du langage.

Soyez reconnaissant de ne pas utiliser un langage où les types de données sont silencieusement contraints entre string et int.

0voto

Rushy Panchal Points 2984

Vous pouvez définir une fonction à cet effet :

def isEqual(a, b):
    if not isinstance(a, type(b)): raise TypeError('a and b must be of same type')
    return a == b # only executed if an error is not raised

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