Combinando insieme le risposte di @jamylak e @ jpaddison3, se devi essere robusto contro gli array intorpiditi come input e gestirli allo stesso modo degli elenchi, dovresti usare
import numpy as np
isinstance(P, (list, tuple, np.ndarray))
Ciò è efficace contro le sottoclassi di matrici di elenchi, tuple e intorpidimento.
E se vuoi essere robusto anche con tutte le altre sottoclassi di sequenza (non solo elenco e tupla), usa
import collections
import numpy as np
isinstance(P, (collections.Sequence, np.ndarray))
Perché dovresti fare le cose in questo modo isinstance
e non confrontarle type(P)
con un valore target? Ecco un esempio, in cui creiamo e studiamo il comportamento di NewList
una banale sottoclasse di elenco.
>>> 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
Nonostante x
e y
confrontando come uguali, gestirli con il type
risultato comporterebbe comportamenti diversi. Tuttavia, poiché x
è un'istanza di una sottoclasse di list
, using isinstance(x,list)
fornisce il comportamento e gli ossequi desiderati x
e y
allo stesso modo.
type
?