Skip to content

進階 Python 型別

🌐 AI 與人類共同完成的翻譯

此翻譯由人類指導的 AI 完成。🤝

可能會有對原意的誤解,或讀起來不自然等問題。🤖

你可以透過協助我們更好地引導 AI LLM來改進此翻譯。

英文版

以下是一些在使用 Python 型別時可能有用的額外想法。

使用 UnionOptional

如果你的程式碼因某些原因無法使用 |,例如不是在型別註記中,而是在像 response_model= 之類的參數位置,那麼你可以用 typing 中的 Union 來取代豎線(|)。

例如,你可以宣告某個值可以是 strNone

from typing import Union


def say_hi(name: Union[str, None]):
        print(f"Hi {name}!")

typing 中也有用 Optional 宣告某個值可以是 None 的速記法。

以下是我個人(非常主觀)的建議:

  • 🚨 避免使用 Optional[SomeType]
  • 改為 ✨ 使用 Union[SomeType, None] ✨。

兩者等價且底層相同,但我會推薦用 Union 而不要用 Optional,因為「optional」這個詞看起來會讓人以為這個值是可選的,但實際上它的意思是「可以是 None」,即使它不是可選的、仍然是必填。

我認為 Union[SomeType, None] 更能清楚表達其含義。

這只是措辭與命名問題,但這些詞會影響你與團隊成員對程式碼的理解。

例如,看看下面這個函式:

from typing import Optional


def say_hi(name: Optional[str]):
    print(f"Hey {name}!")

參數 name 被標註為 Optional[str],但它並不是可選的;你不能在沒有該參數的情況下呼叫這個函式:

say_hi()  # 糟了,這會拋出錯誤!😱

參數 name 仍是必填(不是可選),因為它沒有預設值。不過,name 可以接受 None 作為值:

say_hi(name=None)  # 這可行,None 是有效的 🎉

好消息是,多數情況下你可以直接用 | 來定義型別聯集:

def say_hi(name: str | None):
    print(f"Hey {name}!")

因此,通常你不必為 OptionalUnion 這些名稱操心。😎