2016-05-19 5 views
1
a = ['a', 'b', 'c', 'd'] 
b = set(a) 
print isinstance(a, types.ListType) 
print isinstance(b, types.ListType) 

Das Ergebnis zeigt, dass b nicht von types.ListType ist. In Python gibt es jedoch keinen 'SetType'. Also, was ist der Typ 'XXXType', so dass instance (b, types.XXXType) True ist?Was ist der Typ von set() in Python?

+3

'isinstance (a, list)' und 'isinstance (b, set)' geben True zurück. – fedorqui

Antwort

7

Verwenden Sie isinstance(b, set).

Die types Verweise auf eingebauten Typen gibt es nur für die Bequemlichkeit * und sonst veraltet sind (sie vom Python 3.x version of the types module entfernt wurden). Als solche wurde set nie hinzugefügt.

Zum Beispiel types.ListType ist nur ein Alias ​​für list:

>>> import types 
>>> types.ListType is list 
True 
>>> isinstance([1, 2, 3], list) 
True 

Wenn Sie Muss haben eine SetType Referenz im types Modul, fügen Sie einfach den Alias ​​selbst:

types.SetType = set 

Wenn Sie suchen nach einer abstrakten Basisklasse für den grundlegenden Containertyp, verwenden Sie die collections module ABCs; dieses Signal was Methoden eine Art Unterstützung und Kontrolle gegen diese Art können Sie eine breitere Palette von Typen, die spezifischen Operationen lassen erkennen (und nicht seine eine Instanz nur die list und set Typen) unterstützen:

>>> from collections import Set, MutableSequence 
>>> isinstance([1, 2, 3], MutableSequence) 
True 
>>> isinstance({1, 2, 3}, Set) 
True 

*Geschichte Lektion: Es war einmal, die eingebauten Typen wie int und list waren nicht wirklich Klassen, und die eingebauten Namen int() und list() waren einfach Funktionen in die integrierten Typen konvertieren. Das bedeutet, dass die Namen einfach nicht das gleiche Objekt wie types.IntType und types.ListType waren und Sie hatten, um das types Modul zu verwenden, um isinstance() für ein Listenobjekt verwenden zu können. Diese Zeit ist jetzt lang, lange hinter uns, und die Rolle des types Moduls hat sich geändert.