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 isinstance
y no compararlas type(P)
con un valor objetivo? Aquí hay un ejemplo, donde hacemos y estudiamos el comportamiento de NewList
una 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 x
y y
comparándolos como iguales, manejarlos con ellos type
resultaría en un comportamiento diferente. Sin embargo, ya que x
es una instancia de una subclase de list
, utilizando isinstance(x,list)
da el comportamiento y trata deseado x
y y
de la misma manera.
type
?