Python / typing === ###### tags: `Python` ###### tags: `Python`, `PyPi`, `typing` <br> [TOC] <br> ## 教學資源 - [使用 Python typing 模組對你的同事好一點](https://myapollo.com.tw/blog/python-typing-module/) <br> ## Literal ### 討論 - **Question** `from typing import Literal` Literal 用途為何? - **ChatGPT4** `Literal` 是 Python 的 `typing` 模組中一個非常實用的類型提示工具,其主要用途是讓你能夠指定一個變量或函數參數/返回值可以具有的確切值。當你使用 `Literal` 進行類型標注時,你實際上是在限定該變量或函數的特定幾個值,這有助於提高代碼的可讀性和健壯性。 ### 主要用途 1. 確定性與嚴格性: 使用 `Literal` 可以確保某個變量或函數參數只能是預定義的幾個值之一。這對於開發需要非常明確的、可控的行為的應用非常有用。 2. 增加代碼的可讀性: 通過查看函數定義或變量聲明,開發者可以直接知道這些變量或返回值的可能取值,不需要額外查找這些值的含義。 3.增強靜態分析: 使用 `Literal` 能夠讓靜態類型檢查工具(如 MyPy)更有效地檢查代碼,減少錯誤和進行更精確的推論。 ### 示例 假設你正在開發一個網站,需要指定 HTTP 請求的方法,你可以使用 `Literal` 來限定函數接受的方法類型: ```python from typing import Literal def handle_request(method: Literal['GET', 'POST', 'PUT', 'DELETE']) -> str: if method == 'GET': return 'Handling GET request' elif method == 'POST': return 'Handling POST request' # 更多條件分支... else: return 'Method not allowed' ``` 在這個例子中,`method` 參數被限定只能是 'GET', 'POST', 'PUT', 或 'DELETE' 中的一個。這不僅讓這個函數的使用者非常清楚哪些值是可以接受的,而且還能在靜態分析時捕捉到任何不符合這些條件的錯誤使用。 ### 使用時的考慮 雖然 `Literal` 提供了嚴格的類型限制,但使用時也需要考慮其帶來的限制。例如,如果你的代碼需要更高的靈活性,或者可能的值很多但是不容易提前確定,使用 `Literal` 可能就不太合適。在這些情況下,你可能會考慮使用更寬泛的類型標注(如 `str` 或 `int`),或者定義更複雜的類型檢查邏輯。