2015-07-13 3 views
0

J'ai juste essayé de tester:Pourquoi la vérification de type ne fonctionne pas pour quel type renvoie?

if type(model_lines) == 'str': 
    turn into a list using split 

basé sur:

In [196]: type('a') 
Out[196]: str 

cependant, pour x, une chaîne:

In [193]: if type(x) == 'str': 
    print 'string' 
    .....: 

In [195]: if type(x) == type('a'): 
    print 'string' 
    .....:  
string 

Je suis curieux de savoir pourquoi je ne peux pas utiliser ce sortie pour vérifier les types, il semble plus propre et plus rapide à lire. Que retourne réellement le type qui ne permettra pas la vérification par son affichage de retour?

Répondre

4

Parce que, type() retourne la classe de l'objet, et non pas le nom de chaîne de la classe, donc si vous faites quelque chose comme ci-dessous, il travaillerait -

>>> if type('abcd') == str: 
...  print("Blah") 
... 
Blah 
>>> type('abcd') 
<class 'str'> 

Comme vous le soulignez ci-dessus, j'ai vérifié le retour de type('abcd') par rapport à la classe str, pas la chaîne 'str'.

Si vous voulez la représentation sous forme de chaîne de la classe, utilisez tpye(<something>).__name__, pour obtenir le nom de la chaîne de la classe, Bien que cela ne soit pas nécessaire pour votre cas, juste pour votre information. Exemple -

>>> type('abcd').__name__ 
'str' 
-1

Parce que type('a') peut également générer une instance Unicode. Vous pouvez affirmer cela en voyant la sortie de type('a').

+0

Je n'ai pas vu de différence dans le shell ipython entre le type ('a') et le type ('test'). vouliez-vous dire type (test)? type (test) renvoie 'function' – codyc4321

+0

C'est mon erreur, désolé. essayez simplement le type ('a'). – purrogrammer

+1

C'est pourquoi il est déconseillé d'utiliser 'type' pour contrôler le flux, mais ce n'est pas la raison pour laquelle le PO obtient ses résultats. 'type ('a')' ne peut pas évaluer en '', mais 'type (u'a ')' peut aussi bien qu'une chaîne stockée dans une variable. – SuperBiasedMan