Hiểu về tính đúng, sai và ý nghĩa của sự trống rỗng trong Python
Giới thiệu
Trong Python, khái niệm về tính đúng và sai không chỉ đơn thuần là True và False. Thực tế, nó phản ánh ý nghĩa của đối tượng trong ngữ cảnh logic. Bài viết này sẽ giúp bạn hiểu rõ hơn về cách thức mà Python đánh giá tính đúng của các đối tượng thông qua phương thức __bool__ và cách thiết kế của nó.
Phần 1: Câu Hỏi của Trình Thông Dịch
Khi Python đánh giá một đối tượng trong ngữ cảnh boolean, ví dụ như trong một câu lệnh if:
python
if some_object:
...
Python sẽ thực hiện theo trình tự sau:
- Gọi phương thức
some_object.__bool__()nếu nó được định nghĩa. - Nếu không có, Python sẽ gọi
some_object.__len__():- Nếu độ dài bằng 0, coi như là False.
- Ngược lại, coi như là True.
- Nếu cả hai phương thức đều không được định nghĩa, mặc định sẽ là True.
Như vậy, ngay cả một lớp tùy chỉnh cũng có thể định nghĩa cách thức đánh giá tính đúng của nó.
Phần 2: Tạo Ra Tính Đúng của Chúng Ta
Hãy cùng xây dựng một đối tượng đơn giản: một cuộn giấy chứa tri thức.
python
class Scroll:
def __init__(self, text):
self.text = text
Bây giờ, hãy kiểm tra tính đúng của nó:
python
s = Scroll("Đừng tìm kiếm sự thật, chỉ cần ngừng trân trọng những ý kiến.")
if s:
print("Cuộn giấy đang phát biểu.")
else:
print("Cuộn giấy im lặng.")
Mệnh đề trên sẽ luôn in ra "Cuộn giấy đang phát biểu.", vì Scroll không có phương thức __bool__ hay __len__. Python mặc định coi tất cả các đối tượng là True trừ khi được thông báo khác.
Bây giờ, hãy cho nó một giọng nói của sự thật:
python
class Scroll:
def __init__(self, text):
self.text = text
def __bool__(self):
return bool(self.text.strip())
Lúc này, hãy quan sát:
python
Scroll(" ") # Hành xử như False
Scroll("Hòa bình") # Hành xử như True
Chúng ta đã dạy cho đối tượng của mình cách thể hiện sự hiện diện của nó.
Phần 3: Sử Dụng __len__ Khi Cần
Nếu __bool__ không được định nghĩa, Python sẽ tìm kiếm __len__.
python
class WisdomBasket:
def __init__(self):
self.sayings = []
def __len__(self):
return len(self.sayings)
Bây giờ:
python
basket = WisdomBasket()
if basket:
print("Có tri thức.")
else:
print("Giỏ rỗng.")
Điều này rất hữu ích khi đối tượng của bạn đại diện cho một bộ sưu tập và tính đúng được gắn liền với nội dung của nó.
Phần 4: Thiết Kế Tính Đúng Như Một Quyết Định
Tại sao điều này lại quan trọng?
Bởi vì trong mã thực tế, tính đúng thường mang ý nghĩa. Hãy xem xét ví dụ:
python
if response:
...
Response nên có ý nghĩa gì?
- Yêu cầu HTTP có thành công không?
- Nội dung phản hồi có chứa dữ liệu hữu ích không?
- Trạng thái có phải là 200 không?
Bạn quyết định những gì __bool__ nên truyền đạt.
Khi thiết kế API, thư viện nội bộ hoặc các lớp do người dùng định nghĩa, một định nghĩa rõ ràng về tính đúng có thể giảm thiểu mã thừa và làm cho ý định trở nên rõ ràng.
Phần 5: Lưu Ý về Sự Mơ Hồ
Tính đúng nên rõ ràng và dễ hiểu.
Nếu đối tượng của bạn đại diện cho một cấu hình, một yêu cầu hoặc một tài nguyên, hãy xem xét ý nghĩa của việc trở thành “truthy”. Tránh sự khéo léo khiến logic trở nên khó hiểu:
python
if config:
# Điều này nghĩa là gì?
Tốt hơn là hãy tài liệu hóa, hoặc tránh sử dụng tính đúng hoàn toàn nếu ngữ nghĩa không rõ ràng.
Kết Luận
Bậc thầy không nói: "Danh sách rỗng là False."
Ngài đã nói: "Không phải là sai. Chỉ là rỗng."
Trong Python, tính đúng không phải là cố định. Nó là một cái bóng được tạo ra bởi thiết kế của bạn. Bạn có thể chọn cách mà các đối tượng của bạn phản ánh ánh sáng, hoặc sự thiếu vắng của nó.
Nếu bạn thích bài viết này, hãy cân nhắc việc đăng ký hoặc chia sẻ nó với bạn bè của bạn:
Python Koans | Vivis Dev | Substack
Các bài học Python được bọc trong các koan. Những câu đố nhỏ, những chân lý sâu sắc. Không phải là chuỗi hướng dẫn thông thường của bạn. Nhấp để đọc Python Koans, bởi Vivis Dev, một ấn phẩm Substack với hàng trăm người đăng ký.