สำหรับ 3.1+ ข้อใดข้อหนึ่งต่อไปนี้:
isinstance(something, io.TextIOBase)
isinstance(something, io.BufferedIOBase)
isinstance(something, io.RawIOBase)
isinstance(something, io.IOBase)
สำหรับ 2.x "ออบเจ็กต์คล้ายไฟล์" เป็นสิ่งที่คลุมเครือเกินกว่าจะตรวจสอบได้ แต่เอกสารประกอบสำหรับฟังก์ชันใดก็ตามที่คุณกำลังใช้งานอยู่หวังว่าจะบอกคุณได้ว่าพวกเขาต้องการอะไร ถ้าไม่อ่านรหัส
ดังที่คำตอบอื่น ๆ ชี้ให้เห็นสิ่งแรกที่ต้องถามคือสิ่งที่คุณกำลังตรวจสอบ โดยปกติ EAFP นั้นเพียงพอและมีสำนวนมากกว่า
คำศัพท์ว่า "ไฟล์เหมือนวัตถุ" เป็นคำพ้องความหมายสำหรับ "วัตถุไฟล์" ซึ่งในที่สุดหมายความว่ามันเป็นตัวอย่างของหนึ่งในสามของนามธรรมคลาสฐานที่กำหนดไว้ในโมดูลซึ่งเป็นตัวย่อยทั้งหมดของ ดังนั้นวิธีตรวจสอบจึงเป็นไปตามที่แสดงด้านบนioIOBase
(อย่างไรก็ตามการตรวจสอบIOBaseไม่ได้มีประโยชน์มากนักคุณลองนึกภาพกรณีที่คุณต้องแยกความเหมือนไฟล์จริงread(size)ออกจากฟังก์ชันอาร์กิวเมนต์เดียวที่ชื่อreadไม่เหมือนไฟล์โดยไม่จำเป็นต้องแยกความแตกต่างระหว่างไฟล์ข้อความและไฟล์ดิบ ไฟล์ไบนารีจริง ๆ แล้วคุณมักต้องการตรวจสอบเช่น "เป็นวัตถุไฟล์ข้อความ" ไม่ใช่ "เป็นวัตถุที่มีลักษณะคล้ายไฟล์")
สำหรับ 2.x ในขณะที่ioโมดูลมีมาตั้งแต่ 2.6+ อ็อบเจ็กต์ไฟล์ในตัวไม่ใช่อินสแตนซ์ของioคลาสไม่มีอ็อบเจ็กต์ที่คล้ายไฟล์ใด ๆ ใน stdlib และทั้งสองก็ไม่ใช่อ็อบเจ็กต์ไฟล์ของบุคคลที่สามส่วนใหญ่ มีแนวโน้มที่จะพบ ไม่มีคำจำกัดความอย่างเป็นทางการว่า "file-like object" หมายถึงอะไร มันเป็นแค่ "สิ่งที่เหมือนออบเจ็กต์ไฟล์ในตัว " และฟังก์ชันที่แตกต่างกันหมายถึงสิ่งที่แตกต่างกันโดย "like" ฟังก์ชันดังกล่าวควรบันทึกความหมาย หากไม่เป็นเช่นนั้นคุณต้องดูรหัส
อย่างไรก็ตามความหมายที่พบบ่อยที่สุดคือ "has read(size)" "has read()" หรือ "is an iterable of strings" แต่ไลบรารีเก่าบางแห่งอาจคาดหวังreadlineแทนที่จะเป็นหนึ่งในนั้นไลบรารีบางแห่งชอบclose()ไฟล์ที่คุณให้บางไลบรารีอาจคาดหวังว่าหากfilenoมีอยู่แล้วฟังก์ชันอื่น ๆ จะพร้อมใช้งาน ฯลฯ และในทำนองเดียวกันสำหรับwrite(buf)(แม้ว่าจะมีตัวเลือกน้อยกว่ามากในทิศทางนั้น)
whyสิ่งที่เกี่ยวกับผู้ประกอบการต้องการ__add__,__lshift__หรือ__or__ในชั้นเรียนที่กำหนดเอง? (ไฟล์ออบเจ็กต์และ API: docs.python.org/glossary.html#term-file-object )