Комбинируя ответы @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
?