Tin tức và phân tích của tất cả các thiết bị di động

Gỡ lỗi hiệu quả với câu lệnh Assert trong Python

bạn có phải là lập trình viên không? Nếu vậy, gỡ lỗi là một kỹ năng cơ bản, bất kể bạn viết mã bằng ngôn ngữ nào. Trong bài viết này, bạn sẽ tìm hiểu cách sử dụng câu lệnh khẳng định của Python để gỡ lỗi hiệu quả.

Khi bạn làm việc trên một dự án, bạn sẽ xác định nhiều mô-đun. Điều này bao gồm các hàm, định nghĩa lớp, v.v. Và bạn có thể sẽ gặp lỗi hoặc kết quả không mong muốn do lỗi triển khai. Các câu lệnh khẳng định rất hữu ích trong việc gỡ lỗi những đoạn mã như vậy.

Trong hướng dẫn này, chúng ta sẽ tìm hiểu cú pháp sử dụng câu lệnh khẳng định và các ví dụ mã để xem nó hoạt động như thế nào. Chúng ta cũng sẽ xem lỗi xác nhận là gì và cách chúng ta có thể sử dụng chúng để sửa lỗi trong mã trong quá trình phát triển.

Hãy bắt đầu!

Cách sử dụng Câu lệnh khẳng định trong Python

Chúng ta sẽ tìm hiểu cú pháp của câu lệnh khẳng định và sau đó chúng ta sẽ viết mã một số ví dụ.

Khẳng định cú pháp câu lệnh

Hãy bắt đầu với cú pháp sử dụng câu lệnh khẳng định trong Python:

assert expression, message

Đây,

  • biểu thức là bất kỳ biểu thức python hợp lệ nào để đánh giá. Đây có thể là điều kiện về giá trị của biến, giá trị logic của biến, giá trị trả về của hàm, v.v.
  • Miễn là biểu thức được đánh giá là Đúng, khẳng định sẽ không đưa ra lỗi hoặc trả về bất cứ điều gì. Điều này có nghĩa là chương trình hoạt động như mong đợi.
  • Nếu biểu thức không còn đúng nữa thì ngoại lệ AssertionError sẽ được ném ra.
  • tin nhắn là một chuỗi tùy chọn. Bạn có thể chỉ định một thông báo sẽ được hiển thị ở backtrace bất cứ khi nào một ngoại lệ AssertionError được ném ra.

Tiếp theo, hãy chuyển sang viết mã một số ví dụ trong đó câu lệnh khẳng định có thể giúp chúng ta viết mã sạch hơn và không có lỗi.

Bạn có thể tìm thấy các ví dụ về mã được sử dụng trong hướng dẫn này trong ý chính GitHub này.

Ví dụ về câu lệnh Assert trong Python

Hãy xem xét ví dụ sau. Giả sử bạn có một biến giảm giá trong mã của mình. Nhưng bạn muốn giá trị của nó luôn nhỏ hơn hoặc bằng max_discount.

Để kiểm tra xem bạn có vô tình đặt biến giảm giá thành một giá trị hay không, bạn có thể thêm một xác nhận. Biểu thức cần tính là: chiết khấu <= max_discount.

>>> max_discount = 50
>>> discount = 20
>>> assert discount <= max_discount

Ở đây mức giảm giá (20) nhỏ hơn max_discount (50). Vì vậy, câu lệnh khẳng định không đưa ra bất kỳ lỗi nào.

Ngoại lệ AssertionError

Nếu biến giảm giá được đặt thành giá trị lớn hơn max_discount thì ngoại lệ AssertionError sẽ được đưa ra.

>>> discount = 75
>>> assert discount <= max_discount
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError

Chúng tôi biết rằng câu lệnh khẳng định cũng cho phép chúng tôi chỉ định một chuỗi thông báo tùy chọn.

Chúng ta cũng hãy sử dụng chuỗi thông báo chứa nhiều thông tin chẩn đoán mang tính mô tả hơn. Hãy thêm chuỗi f trong Python vào câu lệnh khẳng định, chuỗi này cũng chứa các giá trị chiết khấu và max_discount.

>>> assert discount <= max_discount, f"discount should be at most {max_discount}; got discount = {discount}"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError: discount should be at most 50; got discount = 75

Như bạn có thể thấy trong ô đầu ra ở trên, ngoại lệ AssertionError hiện bao gồm các giá trị cho Giảm giá và max_discount.

Gỡ lỗi và kiểm tra các hàm Python bằng Assert

Khi xác định một hàm, đôi khi bạn có thể vô tình tạo ra các lỗi (lỗi logic) khiến hàm đó không thể hoạt động như dự định.

Hãy lấy một ví dụ. Giả sử có một bài kiểm tra trên lớp và học sinh có cơ hội trả lời thêm một câu hỏi. Mỗi học sinh cố gắng trả lời câu hỏi bổ sung sẽ nhận được thêm 10 điểm trong bài kiểm tra. 😄

Hãy xem xét hàm get_final_score sau:

  • Bao gồm điểm hiện tại, điểm số và phần thưởng câu đố.
  • Nếu học sinh trả lời câu hỏi bổ sung, phần thưởng của câu đố là Đúng và họ nhận được nhiều hơn 10 điểm so với số điểm hiện tại.
  • Hàm sau đó trả về kết quả cuối cùng.
def get_final_score(score,bonus):
    if bonus:
        score += 10
    return score

Hãy thực hiện một số lệnh gọi hàm. Chúng ta có thể thấy rằng đối với điểm 34 và 40 với phần thưởng được đặt thành Đúng và Sai, điểm cuối cùng lần lượt là 44 và 40.

print(get_final_score(34,True))
# 44
print(get_final_score(40,False))
# 40

Tuy nhiên, điểm tối đa của bài kiểm tra là 50. Vì vậy, nếu một học sinh đạt 49 điểm và cũng đã trả lời câu hỏi tùy chọn, hàm get_final_score sẽ vui vẻ tính ra điểm cuối cùng là 59.

print(get_final_score(49,True))
# 59

Về mặt kỹ thuật thì có thể. Tuy nhiên, giả sử rằng một học sinh không thể đạt được nhiều hơn số điểm tối đa có thể có cho một bài kiểm tra. 🙂

Vì vậy, hãy khởi tạo biến max_score. Và ghi lại điểm được trả về từ hàm trong biến Final_score.

Sau đó, chúng tôi thêm một xác nhận để kiểm tra xem điểm cuối cùng có nhỏ hơn điểm tối đa hay không.

def get_final_score(score,bonus):
    if bonus:
        score += 10
    return score

final_score = get_final_score(47,True)
max_score = 50

assert final_score <= max_score

Bây giờ chúng tôi nhận được AssertionError cho lệnh gọi tới get_final_score(47,True):

Traceback (most recent call last):
  File "main.py", line 17, in <module>
    assert final_score <= max_score
AssertionError

Bây giờ chúng ta thêm một chuỗi f mô tả vào câu lệnh xác nhận Python:

assert final_score <= max_score,f"final_score should be at most {max_score}; got {final_score}"
Traceback (most recent call last):
  File "main.py", line 17, in <module>
    assert final_score <= max_score,f"final_score should be at most {max_score}; got {final_score}"
AssertionError: final_score should be at most 50; got 57

Sửa đổi chức năng

Hãy quay lại và sửa đổi định nghĩa hàm get_final_score để khắc phục hành vi không mong muốn:

  • Hàm get_final_score cũng lấy max_score làm tham số.
  • Chúng tôi kiểm tra xem tiền thưởng có thật không. Nếu Đúng, chúng ta cộng 10 điểm vào biến tính điểm.
  • Sau đó, chúng tôi kiểm tra xem điểm có lớn hơn max_score hay không. Nếu vậy, chúng tôi trả về max_score.
  • Nếu không, chúng tôi trả lại kết quả.

Hiện chúng tôi đã đảm bảo rằng điểm cuối cùng luôn nhỏ hơn hoặc bằng max_score.

def get_final_score(score,bonus,max_score):
    if bonus:
        score += 10
    if score > max_score:
        return max_score
    return score

Như một bài tập nhanh, hãy viết một vài câu để xác nhận rằng tính năng này hiện hoạt động như mong đợi.

Ghi chú ngoại lệ AssertionError

Mặc dù ngoại lệ AssertionError xảy ra khi một biểu thức đánh giá là Sai, chúng ta nên nhớ không coi những lỗi đó là ngoại lệ. Điều này có nghĩa là chúng ta không nên làm điều gì đó như thế này:

try:
    <doing this>
except AssertionError:
    <do this>

Trong ví dụ trước, chúng ta đã sử dụng get_final_score để kiểm tra xem Final_score có nhỏ hơn max_score hay không. Sau đó, chúng tôi sửa đổi định nghĩa hàm để không có lỗi xác nhận.

Đó chính là mục đích của những lời khẳng định. Đây là các bài kiểm tra xác thực mã và giúp bạn viết mã sạch hơn. Mặt khác, xử lý ngoại lệ là dự đoán và xử lý các lỗi không mong muốn trong thời gian chạy. Chúng thường bao gồm các loại và giá trị đầu vào không hợp lệ.

Tóm lại, để gỡ lỗi hiệu quả, bạn nên sử dụng các câu lệnh khẳng định trong Python, không coi AssertionErrors là ngoại lệ.

Ứng dụng

Hướng dẫn này đã giúp bạn hiểu cách sử dụng câu lệnh khẳng định trong Python. Dưới đây là tóm tắt những gì bạn đã học được:

  • Các xác nhận (xác nhận) của Python ở dạng biểu thức xác nhận. Điều này kiểm tra xem biểu thức có đúng hay không. Nếu không đúng, ngoại lệ AssertionError sẽ được đưa ra.
  • Bạn cũng có thể sử dụng khẳng định với cú pháp khẳng định, tin nhắn. Điều này sẽ in một chuỗi thông báo bất cứ khi nào xảy ra ngoại lệ AssertionError.
  • Hãy cẩn thận không triển khai xử lý ngoại lệ để xử lý các lỗi xác nhận. Và sử dụng các xác nhận như một công cụ gỡ lỗi hữu ích để xác thực mã của bạn.

Khẳng định giúp nhà phát triển gỡ lỗi. Để đảm bảo rằng tất cả các thành phần (mô-đun) riêng lẻ trong dự án của bạn hoạt động như mong đợi, bạn có thể tìm hiểu cách viết bài kiểm tra đơn vị bằng Python.

Sau đó, hãy xem danh sách các dự án Python dành cho người mới bắt đầu mà bạn có thể thực hiện.