Vâng, đây là một câu hỏi mở và tôi có hai khía cạnh mà tôi muốn chạm vào: khi nào cần thêm các xác nhận và cách viết thông báo lỗi.
Mục đích
Để giải thích cho người mới bắt đầu - các xác nhận là các câu có thể gây ra lỗi, nhưng bạn sẽ không bắt được chúng. Và chúng thường không nên được nuôi dưỡng, nhưng trong cuộc sống thực, đôi khi chúng vẫn được nuôi dưỡng. Và đây là một tình huống nghiêm trọng, mà mã không thể phục hồi, cái mà chúng ta gọi là "lỗi nghiêm trọng".
Tiếp theo, đó là 'mục đích gỡ lỗi', trong khi, chính xác, nghe có vẻ rất phản cảm. Tôi thích 'công thức bất biến, không bao giờ bị vi phạm' công thức tốt hơn, mặc dù nó hoạt động khác nhau trên những người mới bắt đầu khác nhau ... hoặc thậm chí kiểm soát dòng chảy với nó.
Phong cách
Trong Python, assert
là một câu lệnh, không phải là một hàm! (hãy nhớ rằng assert(False, 'is true')
sẽ không tăng. Nhưng, có cách đó:
Khi nào và bằng cách nào, để viết 'thông báo lỗi' tùy chọn?
Điều này áp dụng triệt để cho các khung kiểm tra đơn vị, thường có nhiều phương thức chuyên dụng để thực hiện các xác nhận ( assertTrue(condition)
,assertFalse(condition), assertEqual(actual, expected)
v.v.). Họ cũng thường cung cấp một cách để bình luận về khẳng định.
Trong mã vứt đi bạn có thể làm mà không cần thông báo lỗi.
Trong một số trường hợp, không có gì để thêm vào xác nhận:
def dump (cái gì đó): khẳng định isinstance (cái gì đó, Dumpable) # ...
Nhưng ngoài ra, một thông báo rất hữu ích để liên lạc với các lập trình viên khác (đôi khi là những người dùng tương tác mã của bạn, ví dụ như trong Ipython / Jupyter, v.v.).
Cung cấp cho họ thông tin, không chỉ rò rỉ chi tiết thực hiện nội bộ.
thay vì:
assert meaningless_identifier <= MAGIC_NUMBER_XXX, 'meaningless_identifier is greater than MAGIC_NUMBER_XXX!!!'
viết:
assert meaningless_identifier > MAGIC_NUMBER_XXX, 'reactor temperature above critical threshold'
hoặc thậm chí có thể:
assert meaningless_identifier > MAGIC_NUMBER_XXX, f'reactor temperature({meaningless_identifier }) above critical threshold ({MAGIC_NUMBER_XXX})'
Tôi biết, tôi biết - đây không phải là một trường hợp cho một xác nhận tĩnh, nhưng tôi muốn chỉ ra giá trị thông tin của tin nhắn.
Thông điệp tiêu cực hay tích cực?
Điều này có thể gây tranh cãi, nhưng nó làm tôi đau khi đọc những thứ như:
assert a == b, 'a is not equal to b'
đây là hai điều trái ngược nhau được viết bên cạnh nhau. Vì vậy, bất cứ khi nào tôi có ảnh hưởng đến codebase, tôi cố gắng chỉ định những gì chúng ta muốn, bằng cách sử dụng các động từ bổ sung như 'phải' và 'nên', và không nói những gì chúng ta không muốn.
khẳng định a == b, 'a phải bằng b'
Sau đó, nhận AssertionError: a must be equal to b
được cũng có thể đọc được và câu lệnh có vẻ hợp lý trong mã. Ngoài ra, bạn có thể lấy một cái gì đó từ nó mà không cần đọc dấu vết (đôi khi thậm chí không có sẵn).