นี่เป็นคำถามเปิดและฉันมีสองด้านที่ฉันต้องการสัมผัส: เมื่อเพิ่มการยืนยันและวิธีการเขียนข้อความแสดงข้อผิดพลาด
วัตถุประสงค์
เพื่ออธิบายให้กับผู้เริ่มต้น - การยืนยันเป็นข้อความที่สามารถทำให้เกิดข้อผิดพลาดได้ แต่คุณจะไม่จับมัน ปกติแล้วพวกเขาไม่ควรเลี้ยงดู แต่ในชีวิตจริง และนี่เป็นสถานการณ์ที่ร้ายแรงซึ่งรหัสไม่สามารถกู้คืนได้จากสิ่งที่เราเรียกว่า 'ข้อผิดพลาดร้ายแรง'
ถัดไปมันมีไว้สำหรับ 'จุดประสงค์ในการแก้ไขข้อบกพร่อง' ซึ่งในขณะที่ถูกต้องนั้นฟังดูน่ารังเกียจมาก ฉันชอบ 'ประกาศค่าคงที่ซึ่งไม่ควรถูกละเมิด' การกำหนดที่ดีขึ้นแม้ว่ามันจะทำงานแตกต่างกันไปสำหรับผู้เริ่มต้นที่แตกต่างกัน ... บางคน 'เพิ่งได้รับ' และคนอื่นไม่สามารถใช้มันได้หรือแทนที่ข้อยกเว้นปกติ หรือควบคุมการไหลด้วย
สไตล์
ใน Python assert
คำสั่งไม่ใช่หน้าที่! (จำassert(False, 'is true')
ไม่ได้ว่าจะเพิ่ม แต่มีที่ออกจากทาง:
เมื่อใดและอย่างไรในการเขียน 'ข้อผิดพลาด' ที่เป็นตัวเลือก
นี้ acually นำไปใช้กับการทดสอบหน่วยกรอบซึ่งมักจะมีวิธีการเฉพาะมากมายที่จะทำยืนยัน ( assertTrue(condition)
, assertFalse(condition), assertEqual(actual, expected)
ฯลฯ ) พวกเขามักจะให้วิธีการแสดงความคิดเห็นในการยืนยัน
ในรหัสทิ้งคุณสามารถทำได้โดยไม่มีข้อความแสดงข้อผิดพลาด
ในบางกรณีไม่มีอะไรที่จะเพิ่มในการยืนยัน:
def dump (บางอย่าง): ยืนยัน isinstance (บางอย่าง, แบบดัมพ์) # ...
แต่นอกเหนือจากนั้นข้อความจะมีประโยชน์สำหรับการสื่อสารกับโปรแกรมเมอร์อื่น ๆ (ซึ่งบางครั้งเป็นผู้ใช้แบบโต้ตอบของโค้ดของคุณเช่นใน Ipython / Jupyter เป็นต้น)
ให้ข้อมูลแก่พวกเขาไม่ใช่แค่เปิดเผยรายละเอียดการใช้งานภายใน
แทน:
assert meaningless_identifier <= MAGIC_NUMBER_XXX, 'meaningless_identifier is greater than MAGIC_NUMBER_XXX!!!'
เขียน:
assert meaningless_identifier > MAGIC_NUMBER_XXX, 'reactor temperature above critical threshold'
หรืออาจจะ:
assert meaningless_identifier > MAGIC_NUMBER_XXX, f'reactor temperature({meaningless_identifier }) above critical threshold ({MAGIC_NUMBER_XXX})'
ฉันรู้ฉันรู้ - นี่ไม่ใช่กรณีสำหรับการยืนยันแบบคงที่ แต่ฉันต้องการชี้ไปที่ค่าข้อมูลของข้อความ
ข้อความเชิงลบหรือเชิงบวก?
นี่อาจเป็นข้อถกเถียง แต่มันทำให้ฉันเจ็บปวดในการอ่านสิ่งต่าง ๆ เช่น:
assert a == b, 'a is not equal to b'
นี่เป็นสองสิ่งที่ขัดแย้งกันซึ่งเขียนถัดจากแต่ละคน ดังนั้นเมื่อใดก็ตามที่ฉันมีอิทธิพลต่อ codebase ฉันกดเพื่อระบุสิ่งที่เราต้องการโดยใช้คำกริยาพิเศษเช่น 'ต้อง' และ 'ควร' และไม่พูดในสิ่งที่เราไม่ต้องการ
ยืนยัน a == b, 'a ต้องเท่ากับ b'
จากนั้นการAssertionError: a must be equal to b
อ่านยังสามารถอ่านได้และคำสั่งจะดูเป็นตรรกะในโค้ด นอกจากนี้คุณยังสามารถนำบางสิ่งออกมาได้โดยไม่ต้องอ่านข้อมูลย้อนกลับ (ซึ่งบางครั้งอาจไม่มีให้ใช้)