Đối với 3.1+, một trong những điều sau:
isinstance(something, io.TextIOBase)
isinstance(something, io.BufferedIOBase)
isinstance(something, io.RawIOBase)
isinstance(something, io.IOBase)
Đối với 2.x, "đối tượng giống tệp" là một thứ quá mơ hồ để kiểm tra, nhưng tài liệu cho bất kỳ (các) chức năng nào bạn đang xử lý sẽ hy vọng cho bạn biết chúng thực sự cần gì; nếu không, hãy đọc mã.
Như các câu trả lời khác đã chỉ ra, điều đầu tiên cần hỏi là bạn đang kiểm tra chính xác điều gì. Thông thường, EAFP là đủ và mang tính thành ngữ hơn.
Các thuật ngữ nói "tập tin giống như đối tượng" là một từ đồng nghĩa với "đối tượng tập tin", mà cuối cùng có nghĩa là nó là một thể hiện của một trong ba lớp cơ sở trừu tượng quy định tại các io
mô-đun , đó là bản thân tất cả các lớp con của IOBase
. Vì vậy, cách kiểm tra chính xác như hình trên.
(Tuy nhiên, việc kiểm tra IOBase
không hữu ích lắm. Bạn có thể tưởng tượng một trường hợp mà bạn cần phân biệt một tệp thực tế giống read(size)
với một hàm một đối số read
nào đó có tên không giống tệp, mà không cần phân biệt giữa tệp văn bản và tệp thô tệp nhị phân? Vì vậy, thực sự, bạn hầu như luôn muốn kiểm tra, ví dụ: "có phải là một đối tượng tệp văn bản", không phải "là một đối tượng giống tệp".)
Đối với 2.x, mặc dù io
mô-đun đã tồn tại từ 2.6+, nhưng các đối tượng tệp tích hợp không phải là phiên bản của io
các lớp, không phải bất kỳ đối tượng giống tệp nào trong stdlib và hầu hết các đối tượng giống tệp của bên thứ ba cũng vậy. có khả năng gặp phải. Không có định nghĩa chính thức về "đối tượng giống tệp" nghĩa là gì; nó chỉ là "một cái gì đó giống như một đối tượng tệp nội trang " và các chức năng khác nhau có nghĩa là những thứ khác nhau bởi "như". Các chức năng như vậy nên ghi lại ý nghĩa của chúng; nếu không, bạn phải xem mã.
Tuy nhiên, các ý nghĩa phổ biến nhất là "có read(size)
", "có read()
" hoặc "là một chuỗi có thể lặp lại", nhưng một số thư viện cũ có thể mong đợi readline
thay vì một trong những ý nghĩa đó, một số thư viện thích close()
các tệp bạn cung cấp, một số sẽ mong đợi rằng nếu fileno
hiện tại thì chức năng khác có sẵn, v.v. Và tương tự cho write(buf)
(mặc dù có ít tùy chọn hơn theo hướng đó).
why
những gì về các toán tử như__add__
,__lshift__
hoặc__or__
trong các lớp tùy chỉnh? (object file và API: docs.python.org/glossary.html#term-file-object )