Menggabungkan jawaban @jamylak dan @ jpaddison3 bersamaan, jika Anda harus kuat terhadap array numpy sebagai input dan menanganinya dengan cara yang sama seperti daftar, Anda harus menggunakan
import numpy as np
isinstance(P, (list, tuple, np.ndarray))
Ini kuat terhadap subclass daftar, array tuple dan numpy.
Dan jika Anda ingin menjadi kuat terhadap semua subclass urutan lainnya juga (bukan hanya daftar dan tuple), gunakan
import collections
import numpy as np
isinstance(P, (collections.Sequence, np.ndarray))
Mengapa Anda melakukan hal-hal seperti ini dengan isinstance
dan tidak membandingkan type(P)
dengan nilai target? Berikut adalah contoh, di mana kita membuat dan mempelajari perilaku NewList
, subkelas daftar sepele.
>>> 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
Meskipun x
dan y
membandingkan sebagai sama, menangani mereka type
akan menghasilkan perilaku yang berbeda. Namun, karena x
adalah sebuah contoh dari subclass dari list
, menggunakan isinstance(x,list)
memberi perilaku yang diinginkan dan memperlakukan x
dan y
dengan cara yang sama.
type
?