Łącząc odpowiedzi @jamylak i @ jpaddison3 razem, jeśli chcesz być odporny na tablice numpy jako dane wejściowe i obsługiwać je w taki sam sposób jak listy, powinieneś użyć
import numpy as np
isinstance(P, (list, tuple, np.ndarray))
Jest to odporne na podklasy tablic list, krotek i tablic numpy.
A jeśli chcesz być odporny na wszystkie inne podklasy sekwencji (nie tylko listę i krotkę), użyj
import collections
import numpy as np
isinstance(P, (collections.Sequence, np.ndarray))
Dlaczego warto robić to w ten sposób, isinstance
a nie porównywać type(P)
z wartością docelową? Oto przykład, w którym tworzymy i badamy zachowanie NewList
trywialnej podklasy listy.
>>> 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
Pomimo x
i y
porównywanie jako równe, obchodzenie się z nimi type
spowodowałoby inne zachowanie. Jednakże, ponieważ x
jest to przykład podklasy list
, stosując isinstance(x,list)
daje pożądane zachowanie i traktuje x
i y
w ten sam sposób.
type
?