iT邦幫忙

2023 iThome 鐵人賽

DAY 28
0
Software Development

Python 微進階系列 第 28

Python 微進階 Day28 - type hint(型別提示)

  • 分享至 

  • xImage
  •  

type hint(型別提示)

  • Python 為動態語言,其中 type hint(型別提示) 從 3.5 版加入
  • 加入的 type hint 並沒有強制性,例如設定 str 實際進入為 int 也不會跳錯,主要是方便 IDE 檢查並且在相關的型別時提供對應的提示,也方便 debug
  • type hint 目前也還在持續調整,因此不同版本的 Python,會有一些語法差異,在使用上要特別注意使用的 Python 版本
  • 在變數前以 變數: 型別 方式加入,回傳 return 值的型別,則在函式後面的 : 前,以 -> 型別 來進行,如 def fun() -> str:
def get_str(s):
    
    return f"this is {s}"

# 加入 type hint
def get_str(s: int) -> str:
    
    return f"this is {s}"
  • list 或 dict 等
    • 3.9 以上(含):直接使用 list、dict
    • 3.9 以下:需引用 typing,from typing import List, Dict
# 3.9 以上(含)
def test(x: list[int]):
    pass

word_json: dict[str, int] = {
    "a": 1,
    "b": 2
}


# 3.9 以下
from typing import List, Dict

def test(x: List[int]):
    pass

word_json: Dict[str, int] = {
    "a": 1,
    "b": 2
}
  • Union:接受多種型別
    • 3.10 以上(含):可以用 | 取代
    • 3.10 以下:需引用 typing,from typing import Union
# 3.10 以上(含)
T = str | int

def concat(a: T, b: T) -> T:
    return a + b


# 3.10 以下
from typing import Union

T = Union[str, int]

def concat(a: T, b: T) -> T:
    return a + b
  • Optional:Optional[X] 等同 X | None 或 Union[X, None]
    • 3.10 以上(含):可以用 |X | None
    • 3.10 以下:需引用 typing,from typing import Optional
# 3.10 以上(含)
def foo(arg: int | None) -> None:
    pass


# 3.10 以下
from typing import Optional

def foo(arg: Optional[int] = None) -> None:
    pass
  • 另外也支援用 class 或使用 NewType 等自定義的型別
class Student(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age


def student_to_string(s: Student) -> str:
    return f"student name: {s.name}, age: {s.age}."

student_to_string(Student("Tim", 18))



from typing import NewType

UserId = NewType('UserId', int)

ProUserId = NewType('ProUserId', UserId)

參考資料

次回

簡單介紹 venv(虛擬環境)與 env(環境變數)


上一篇
Python 微進階 Day27 - comprehension(生成式)
下一篇
Python 微進階 Day29 - venv(虛擬環境)與 env(環境變數)
系列文
Python 微進階31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言