la bonne manière de vérifier le type d'un objet ?

la bonne manière de vérifier le type d'un objet ? - Python - Programmation

Marsh Posté le 20-12-2005 à 15:14:19    

Bonjour,
 
Je cherche à vérifier qu'un objet est du bon type avant de l'ajouter à une liste ; s'il ne l'est pas, on lève une exception. Quelle est la bonne manière de faire cela ? Je préssent qu'il faut utiliser __class__ mais j'ai cherché un peu et je n'arrive pas à trouver.
 
Voici la "mauvaise manière" (enfin je pense) :

Code :
  1. class MaListe(UserList):
  2.     def __init__(self):
  3.         UserList.__init__(self)
  4.        
  5.     def append(self, o):
  6.         if not o.__class__.__name__ == "MaClasse": raise TypeError
  7.         UserList.append(self, o)


 
Merci.

Reply

Marsh Posté le 20-12-2005 à 15:14:19   

Reply

Marsh Posté le 20-12-2005 à 16:35:47    

type ou isinstance sont mieux je pense ...
 
http://www.python.org/doc/current/ [...] funcs.html

Reply

Marsh Posté le 20-12-2005 à 17:01:15    

psychotek a écrit :

Bonjour,
 
Je cherche à vérifier qu'un objet est du bon type avant de l'ajouter à une liste ; s'il ne l'est pas, on lève une exception. Quelle est la bonne manière de faire cela ? Je préssent qu'il faut utiliser __class__ mais j'ai cherché un peu et je n'arrive pas à trouver.
 
Voici la "mauvaise manière" (enfin je pense) :

Code :
  1. class MaListe(UserList):
  2.     def __init__(self):
  3.         UserList.__init__(self)
  4.        
  5.     def append(self, o):
  6.         if not o.__class__.__name__ == "MaClasse": raise TypeError
  7.         UserList.append(self, o)


 
Merci.


La meilleure manière de le faire, c'est de pas le faire.
 
Sinon, isinstance (multani > type est considéré "trai trai mal" sur les ng python:o).
 
Et accessoirement, ça fait depuis Python 2.2 qu'on hérite plus de User*, dégage moi ce UserList et remplace le par "list" si tu es sur un interpréteur 2.2, 2.3 ou 2.4 merssi :o
 
Et un message utilisable pour l'erreur ça serait pas du luxe

Message cité 1 fois
Message édité par masklinn le 20-12-2005 à 17:07:07

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 20-12-2005 à 17:32:16    

masklinn a écrit :

La meilleure manière de le faire, c'est de pas le faire.
 
Sinon, isinstance (multani > type est considéré "trai trai mal" sur les ng python:o).


Spour ça que j'ai mis isinstance aussi [:cupra]
 
Sinon, c'est "trai trai mal" pourquoi, comment, etc. ? [:opus dei]

Reply

Marsh Posté le 20-12-2005 à 17:35:13    

C'est malpratique et peu flexible
 
Mais surtout, type() ne gère pas l'héritage alors que isinstance si:

Code :
  1. >>> class MyClass(object):
  2.     def __init__(self):
  3.         pass
  4.  
  5.     
  6. >>> a = MyClass()
  7. >>> type(a) == MyClass
  8. True
  9. >>> type(a) == object
  10. False
  11. >>> isinstance(a, MyClass)
  12. True
  13. >>> isinstance(a, object)
  14. True
  15. >>>


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 20-12-2005 à 17:42:06    

masklinn tu viens de montrer que "type" était indispensable au lieu de montrer qu'il était à proscrire, là. :gratgrat:
 
On peut vouloir connaître le type exact d'un objet indépendamment de son héritage et donc "isinstance" ne suffit pas. :o

Reply

Marsh Posté le 20-12-2005 à 18:14:16    


Je crois que t'as pas tout pigé au bouzin [:pingouino]
 
L'intérêt d'isinstance c'est qu'il "sait" que notre objet est compatible avec toutes les classes dont il hérite, directement ou indirectement, type ne le sait pas.
 
Mais dans mon exemple, si je teste un machin instancé depuis "object" pour savoir si c'est une instance de "MyClass", je vais me faire jeter [:pingouino]
 
Il n'y a aucun avantage à utiliser type, si t'en trouve un je veux un use case concret [:itm]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 20-12-2005 à 18:42:57    

Ben .. ce serait possible une explication plus "concrète" dans le cas présent proposé par l'auteur ?
Je cite "Je cherche à vérifier qu'un objet est du bon type avant de l'ajouter à une liste" ...  
Voilà; il veut uniquement les objets disons de type MyClass .. rien d'autre et pas un type hérité .. juste celui-là ...
Qu'est-ce qui l'empêche d'utiliser simplement type() ???

Reply

Marsh Posté le 20-12-2005 à 18:44:18    

Mr Mala a écrit :

Ben .. ce serait possible une explication plus "concrète" dans le cas présent proposé par l'auteur ?
Je cite "Je cherche à vérifier qu'un objet est du bon type avant de l'ajouter à une liste" ...  
Voilà; il veut uniquement les objets disons de type MyClass .. rien d'autre et pas un type hérité .. juste celui-là ...
Qu'est-ce qui l'empêche d'utiliser simplement type() ???


Et qu'est-ce que ça pourrait lui apporter?
 
Mais bon, à part ça je reste sur ma position définie en tant que:

Citation :

La meilleure manière de le faire, c'est de pas le faire.


 
cf http://www.canonical.org/~kragen/isinstance/ pour plus d'infos


Message édité par masklinn le 20-12-2005 à 18:47:03

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 20-12-2005 à 18:46:43    

Qu'est-ce que je sais moi, je pose la question, stou !
if type(o) == MyClass :
pis basta, c'est tout puisque c'est spécifiquement CA qu'il veut ...
PQ il ne pourrait pas ?
 
Je pourrais te dire exactement la même chose que toi:
ICI, il n'y a aucun avantage à utiliser isinstance, si t'en trouve un je veux un [..] une explication concrète, je répète, dans le cas présent ! [:itm]

Message cité 1 fois
Message édité par Mr Mala le 20-12-2005 à 18:48:14
Reply

Marsh Posté le 20-12-2005 à 18:46:43   

Reply

Marsh Posté le 20-12-2005 à 20:21:39    

Mr Mala a écrit :

PQ il ne pourrait pas ?


  • il arrive à type() de bugger, ou de demander l'utilisation du modules types


Code :
  1. >>> import UserDict
  2. >>> type(UserDict.UserDict()) == UserDict.UserDict
  3. False
  4. >>> isinstance(UserDict.UserDict(), UserDict.UserDict)
  5. True


 

  • Dans la PEP 8, Guido demande explicitement d'utiliser isinstance et non type
Citation :

   - Object type comparisons should always use isinstance() instead
      of comparing types directly.
 
        Yes: if isinstance(obj, int):
 
        No:  if type(obj) is type(1):


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 21-12-2005 à 01:47:50    

Et ben VOILA ! ... CA, c'est une explication/raison claire et précise !!! ... ;)

Reply

Marsh Posté le 21-12-2005 à 09:20:26    

j'ai beaucoup appris dans ce post, merci à tous.
 
cependant masklinn, pourquoi dis-tu qu'il serait préférable de ne pas le faire ? étant donné qu'on a pas de templates et autres cochoneries de ce genre, comment m'assurer que les éléments de ma liste sont du bon type ?
 
question subsidiaire à propos de List et UserList : il faut éviter d'utiliser UserList mais on peut utiliser UserDict ?
 
merci

Reply

Marsh Posté le 21-12-2005 à 10:06:53    

UserList c'est complètement déprécié. Dérive list directement. Pareil pour dict.
 
Et puis on est en python, évite de faire de la parano au niveau du typage statique.

Reply

Marsh Posté le 21-12-2005 à 11:15:17    

psychotek a écrit :

cependant masklinn, pourquoi dis-tu qu'il serait préférable de ne pas le faire ? étant donné qu'on a pas de templates et autres cochoneries de ce genre, comment m'assurer que les éléments de ma liste sont du bon type ?


La question est:
 
Pourquoi donc veux tu des éléments d'un type précis? que veux tu faire avec tes machins? et quel est le risque de mettre des éléments d'un "mauvais" type dans la liste de toute façon?

psychotek a écrit :

question subsidiaire à propos de List et UserList : il faut éviter d'utiliser UserList mais on peut utiliser UserDict ?


Non [:el g]  
 
Python 2.2 new style classes & unification types & classes:

  • Tout objet doit directement ou indirectement hériter d'object
  • Toutes les classes User* sont dépréciées (sauf nécessité de compatibilité avec Python 2.1 et plus ancien), on peut hériter directement des types standards (list, dict, int, long, set, frozenset, tuple, complex, etc etc)


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 21-12-2005 à 12:58:22    

bon, j'ai encore appris plein des choses, je ne viens pas pour rien ;)
 
concernant la vérification de type, c'est vrai que c'est du python, mais un minimum de vérification ne fait pas mal d'après moi. avoir des listes contenant des objets d'un même type fait partie de ce minimum, d'après moi.
 
disons que je place dans ma liste des objets, avec une archi un peu compliquée et des imbrications de listes dans des listes, et faire ces vérifications de types m'évitent de me planter et de débugger après. l'inférence de type est de l'aide au programmeur, après tout.
 
en fait, bien que dynamique, le système de type pourrait proposer deux types de listes : des listes homogènes et des listes hétérogènes. typage dynamique n'est pas synonyme d'absence de typage. qu'en pensez-vous ?

Reply

Marsh Posté le 21-12-2005 à 13:41:40    

psychotek a écrit :

concernant la vérification de type, c'est vrai que c'est du python, mais un minimum de vérification ne fait pas mal d'après moi. avoir des listes contenant des objets d'un même type fait partie de ce minimum, d'après moi.


Ben tu te plantes [:spamafote]  
 
Vas lire le truc que j'ai posté un peu plus haut sur le sujet, et renseigne toi sur le concept de duck typing (issu de ruby), puis sur le concept de tests unitaires et leur intérêt.

psychotek a écrit :

typage dynamique n'est pas synonyme d'absence de typage. qu'en pensez-vous ?


J'en pense que je vois pas le rapport, Python est un langage à typage dynamique fort, c'est pas pour ça que passer par isinstance a un intérêt.
 
Là encore, renseigne toi sur le concept de duck typing et oublie ce que tu a appris en faisant du java, Python is not Java toussa.


Message édité par masklinn le 21-12-2005 à 13:43:55

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 21-12-2005 à 14:43:04    

issu de ruby ... mouahahahah

Reply

Marsh Posté le 21-12-2005 à 15:08:26    

Taz a écrit :

issu de ruby ... mouahahahah


Le concept est (partiellement) issu des langages à typage dynamique précédents (smalltalk), mais le nom "duck typing" et la formalisation exacte du concept viennent de Dave Thomas sur la ml ruby-talk.
 
Son message d'explication est ici, pas trouvé la première occurence de l'expression.


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 21-12-2005 à 15:23:03    

ah bah si t'es du genre 'c'est le premier qui nomme qui gagne' ...
 
si tu veux pousser loin, tu prends boo, ou duck est carrément un mot-clef

Reply

Marsh Posté le 21-12-2005 à 21:31:47    

Taz a écrit :

ah bah si t'es du genre 'c'est le premier qui nomme qui gagne' ...


Non, contre je suis pas mal du genre "le premier à formaliser un concept", oui [:moule_bite]

Taz a écrit :

si tu veux pousser loin, tu prends boo, ou duck est carrément un mot-clef


Wait, no one cares

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed