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 isinstancee non confrontarle type(P)con un valore target? Ecco un esempio, in cui creiamo e studiamo il comportamento di NewListuna 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 xe yconfrontando come uguali, gestirli con il typerisultato comporterebbe comportamenti diversi. Tuttavia, poiché xè un'istanza di una sottoclasse di list, using isinstance(x,list)fornisce il comportamento e gli ossequi desiderati xe yallo stesso modo.
type?