En combinant les réponses de @jamylak et @ jpaddison3 ensemble, si vous devez être robuste contre les tableaux numpy en entrée et les gérer de la même manière que les listes, vous devez utiliser
import numpy as np
isinstance(P, (list, tuple, np.ndarray))
Ceci est robuste contre les sous-classes de tableaux list, tuple et numpy.
Et si vous voulez également être robuste contre toutes les autres sous-classes de séquence (pas seulement la liste et le tuple), utilisez
import collections
import numpy as np
isinstance(P, (collections.Sequence, np.ndarray))
Pourquoi devriez-vous procéder isinstance
ainsi sans vous comparer type(P)
à une valeur cible? Voici un exemple, où nous créons et étudions le comportement d' NewList
une sous-classe triviale de liste.
>>> class NewList(list):
... isThisAList = '???'
...
>>> x = NewList([0,1])
>>> y = list([0,1])
>>> print x
[0, 1]
>>> print y
[0, 1]
>>> x==y
True
>>> type(x)
<class '__main__.NewList'>
>>> type(x) is list
False
>>> type(y) is list
True
>>> type(x).__name__
'NewList'
>>> isinstance(x, list)
True
Malgré leur comparaison x
et leur y
égalité, leur manipulation type
entraînerait un comportement différent. Cependant, puisqu'il x
s'agit d'une instance d'une sous-classe de list
, using isinstance(x,list)
donne le comportement et les traitements souhaités x
et y
de la même manière.
type
?