Combinando las respuestas de @jamylak y @ jpaddison3 juntas, si necesita ser robusto frente a matrices numpy como entrada y manejarlas de la misma manera que las listas, debe usar
import numpy as np
isinstance(P, (list, tuple, np.ndarray))
Esto es robusto frente a subclases de listas, tuplas y matrices numpy.
Y si también quiere ser robusto frente a todas las demás subclases de secuencia (no solo lista y tupla), use
import collections
import numpy as np
isinstance(P, (collections.Sequence, np.ndarray))
¿Por qué debería hacer las cosas de esta manera isinstancey no compararlas type(P)con un valor objetivo? Aquí hay un ejemplo, donde hacemos y estudiamos el comportamiento de NewListuna subclase trivial de la lista.
>>> 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
A pesar de xy ycomparándolos como iguales, manejarlos con ellos typeresultaría en un comportamiento diferente. Sin embargo, ya que xes una instancia de una subclase de list, utilizando isinstance(x,list)da el comportamiento y trata deseado xy yde la misma manera.
type?