Kết hợp các câu trả lời của @jamylak và @ jpaddison3 với nhau, nếu bạn cần mạnh mẽ chống lại các mảng khó hiểu như đầu vào và xử lý chúng theo cách giống như danh sách, bạn nên sử dụng
import numpy as np
isinstance(P, (list, tuple, np.ndarray))
Điều này là mạnh mẽ chống lại các lớp con của danh sách, tuple và numpy mảng.
Và nếu bạn cũng muốn mạnh mẽ đối với tất cả các lớp con khác của chuỗi (không chỉ liệt kê và tuple), hãy sử dụng
import collections
import numpy as np
isinstance(P, (collections.Sequence, np.ndarray))
Tại sao bạn nên làm mọi thứ theo cách này isinstance
và không so sánh type(P)
với giá trị mục tiêu? Dưới đây là một ví dụ, nơi chúng ta thực hiện và nghiên cứu hành vi của NewList
, một lớp con tầm thường của danh sách.
>>> 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
Mặc dù x
và y
so sánh như nhau, xử lý chúng type
sẽ dẫn đến hành vi khác nhau. Tuy nhiên, vì x
là một thể hiện của một lớp con của list
, sử dụng isinstance(x,list)
cung cấp cho các hành vi mong muốn và xử lý x
và y
theo cách tương tự.
type
chưa?