Комбинируя ответы @jamylak и @ jpaddison3 вместе, если вам нужно быть устойчивым к массивным массивам в качестве входных данных и обрабатывать их так же, как списки, вы должны использовать
import numpy as np
isinstance(P, (list, tuple, np.ndarray))
Это устойчиво к подклассам списков, кортежей и массивов.
И если вы хотите быть устойчивым ко всем другим подклассам последовательности (не только к списку и кортежу), используйте
import collections
import numpy as np
isinstance(P, (collections.Sequence, np.ndarray))
Почему вы должны так поступать, isinstanceа не сравнивать type(P)с целевым значением? Вот пример, где мы создаем и изучаем поведение NewListтривиального подкласса списка.
>>> 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
Несмотря на xи yсравнение , как равные, обработка их typeможет привести к различному поведению. Однако, так xкак это экземпляр подкласса list, использование isinstance(x,list)дает желаемое поведение и обрабатывает xи yтаким же образом.
type?