圖片描述

隱藏的教誨: __bool__與真理的設計

在 Python 中,真理並非只有 True 和 False 兩種狀態。它反映了意義。 Python 會問:“從邏輯的角度來說,這個物件本身說明了什麼?”

若要控制物件在布林上下文中的行為(例如在 if 語句中),您可以定義__bool__方法。

讓我們重新開始。

第一部分:口譯員的問題

當 Python 在布林上下文中評估物件時,例如:

if some_object: 
    ...

它執行以下序列:

  1. 如果已定義,則呼叫some_object.__bool__()

  2. 如果未定義,則回退到some_object.__len__()

  • 如果長度為 0,則視為 False。

  • 否則視為 True。

  1. 如果均未定義,則預設為 True

因此,即使是自訂類別也可以定義自己的真實性衡量標準。

第二部分:書寫我們自己的真理

讓我們建立一個簡單的物件:一個智慧的容器。

class Scroll:
    def __init__(self, text):
        self.text = text

現在,讓我們觀察一下它的真相:

s = Scroll("Do not seek the truth, only cease to cherish opinions.")

if s:
    print("The scroll speaks.")
else:
    print("The scroll is silent.")

這總是會印出“The scroll speaks.”,因為 Scroll 沒有__bool____len__ 。除非另有說明,否則 Python 預設將所有物件視為 True。

現在,讓我們說出真實的聲音:

class Scroll:
    def __init__(self, text):
        self.text = text

    def __bool__(self):
        return bool(self.text.strip())

現在,觀察:

Scroll(" ") # Behaves like False
Scroll("Peace") # Behaves like True

我們已經教導了我們的物件如何表達它的存在。

第 3 部分:回歸__len__

如果未定義__bool__ ,Python 將會尋找__len__

class WisdomBasket:
    def __init__(self):
        self.sayings = []

    def __len__(self):
        return len(self.sayings)

現在:

basket = WisdomBasket()
if basket:
    print("There is wisdom.")
else:
    print("The basket is empty.")

當你的物件代表一個集合,並且真相與其內容相關時,這很有用。

第四部分:作為設計決策的真相

這為什麼重要?

因為在現實世界的程式碼中,真值通常就意味著意義。考慮一下:

if response:
    ...

回應應該是什麼意思?

  • HTTP 請求是否成功?

  • 回應主體是否包含有用的資料?

  • 狀態是 200 嗎?

您決定__bool__應該傳達什麼。

在設計 API、內部庫或使用者定義類別時,清晰的真相定義可以減少樣板並使意圖不言而喻。

第五部分:警惕歧義

真實性應該是明確的和直觀的。

如果你的物件代表配置、請求或資源,請思考其「真值」的含義。避免使用一些讓邏輯變得模糊的巧妙方法:

if config:
    # What does this mean?

如果語義不清楚,最好記錄下來,或完全避免使用真實性。

閉合循環

大師並沒有說「空列表是False」。

他說:“不假,只是空。”

在 Python 中,真相並非固定不變。它是你設計投射出的陰影。你可以選擇物件如何反射光線,或不反射光線。


如果您喜歡這篇文章,請考慮訂閱或與您的朋友分享:

{% 嵌入 https://pythonkoans.substack.com/ %}


原文出處:https://dev.to/vivis_dev/understanding-truthiness-falsiness-and-the-quiet-meaning-of-emptiness-in-python-26il


精選技術文章翻譯,幫助開發者持續吸收新知。

共有 0 則留言


精選技術文章翻譯,幫助開發者持續吸收新知。
🏆 本月排行榜
🥇
站長阿川
📝10   💬6   ❤️11
454
🥈
我愛JS
📝1   💬5   ❤️4
88
🥉
AppleLily
📝1   💬4   ❤️1
47
#4
💬2  
6
#5
💬1  
5
評分標準:發文×10 + 留言×3 + 獲讚×5 + 點讚×1 + 瀏覽數÷10
本數據每小時更新一次