Объединяя ответы @jamylak и @ jpaddison3 вместе, если вам нужно быть устойчивым к массивам numpy в качестве входных данных и обрабатывать их так же, как списки, вы должны использовать
import numpy as np
isinstance(P, (list, tuple, np.ndarray))
Это устойчиво к подклассам массивов list, tuple и numpy.
И если вы хотите быть устойчивым и ко всем другим подклассам последовательности (а не только к списку и кортежу), используйте
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
таким же образом.
person
scottclowe
schedule
04.03.2015
type
? - person Sukrit Kalra   schedule 29.05.2013