NotImplemented
งูหลามมีเดี่ยวที่เรียกว่า
ทำไมบางคนต้องการกลับมาNotImplemented
แทนที่จะยกNotImplementedError
ข้อยกเว้น? มันจะไม่ทำให้การค้นหาข้อบกพร่องยากขึ้นเช่นรหัสที่ใช้วิธีการที่ไม่ถูกต้องหรือไม่
NotImplemented
งูหลามมีเดี่ยวที่เรียกว่า
ทำไมบางคนต้องการกลับมาNotImplemented
แทนที่จะยกNotImplementedError
ข้อยกเว้น? มันจะไม่ทำให้การค้นหาข้อบกพร่องยากขึ้นเช่นรหัสที่ใช้วิธีการที่ไม่ถูกต้องหรือไม่
คำตอบ:
เป็นเพราะ__lt__()
และวิธีการเปรียบเทียบที่เกี่ยวข้องมักใช้โดยอ้อมในประเภทรายการและเช่น บางครั้งอัลกอริทึมจะเลือกลองอีกวิธีหนึ่งหรือเลือกผู้ชนะเริ่มต้น การยกข้อยกเว้นจะแยกออกจากการเรียงลำดับเว้นแต่จะถูกจับในขณะที่NotImplemented
ไม่ได้รับการยกและสามารถใช้ในการทดสอบเพิ่มเติม
http://jcalderone.livejournal.com/32837.html
ในการสรุปลิงก์นั้น:
"
NotImplemented
ส่งสัญญาณไปยังรันไทม์ที่ควรให้คนอื่นพึงพอใจกับการดำเนินการในนิพจน์a == b
หากa.__eq__(b)
ส่งคืนNotImplemented
Python จะพยายามb.__eq__(a)
หากb
รู้ว่าจะส่งคืนได้เพียงพอTrue
หรือหากเป็นFalse
เช่นนั้นนิพจน์จะประสบความสำเร็จหากไม่เป็นเช่นนั้น ถอยกลับไปใช้พฤติกรรมในตัว (ซึ่งขึ้นอยู่กับตัวตนของ==
และ!=
) "
a.__eq__(b)
ส่งคืน NotImplemented ไม่สามารถจับ NotImplementedError แทนได้อย่างง่ายดายb.__eq__(a)
หรือไม่(และโทรหรืออะไรก็ตาม)
เพราะพวกเขามีกรณีการใช้ที่แตกต่างกัน
การอ้างอิงเอกสาร (Python 3.6):
ควรจะกลับโดยวิธีพิเศษไบนารี (เช่น
__eq__()
,__lt__()
,__add__()
,__rsub__()
ฯลฯ ) เพื่อแสดงให้เห็นว่าการดำเนินการไม่ได้ดำเนินการที่เกี่ยวกับประเภทอื่น ๆ
[... ] ในคลาสพื้นฐานที่ผู้ใช้กำหนดวิธีนามธรรมควรเพิ่มข้อยกเว้นนี้เมื่อพวกเขาต้องการคลาสที่ได้รับเพื่อแทนที่เมธอดหรือขณะที่คลาสกำลังพัฒนาเพื่อระบุว่าการใช้งานจริงยังคงต้องเพิ่ม
ดูลิงค์สำหรับรายละเอียด
เหตุผลหนึ่งคือประสิทธิภาพ ในสถานการณ์เช่นการเปรียบเทียบที่สมบูรณ์ซึ่งคุณสามารถทำการดำเนินการจำนวนมากได้ในเวลาอันสั้นการตั้งค่าและจัดการข้อยกเว้นจำนวนมากอาจใช้เวลานานกว่าการคืนNotImplemented
ค่า