Combinando as respostas @jamylak e @ jpaddison3, se você precisar ser robusto com matrizes numpy como entrada e manipulá-las da mesma maneira que as listas, use
import numpy as np
isinstance(P, (list, tuple, np.ndarray))
Isso é robusto contra subclasses de matrizes de lista, tupla e numpy.
E se você quiser ser robusto com todas as outras subclasses de sequência (não apenas lista e tupla), use
import collections
import numpy as np
isinstance(P, (collections.Sequence, np.ndarray))
Por que você deve fazer as coisas dessa maneira isinstance
e não comparar type(P)
com um valor-alvo? Aqui está um exemplo, onde criamos e estudamos o comportamento de NewList
, uma subclasse trivial da 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
Apesar x
e y
comparando como iguais, lidar com eles type
resultaria em um comportamento diferente. No entanto, uma vez que x
é uma instância de uma subclasse de list
, using isinstance(x,list)
fornece o comportamento e os tratamentos desejados x
e y
da mesma maneira.
type
?