什么是类型标注?
和 JS 等弱类型的语言一样, 当项目变大代码变多的时候, 弱类型带来的影响会越来越明显, 所以 JS 引入了 TS, 在 python 社区也有类似的解决方案, 那就是 typing
python
x: int = 10
x = 20
x = "10" # Literal['10'] is not assignable to 'int'
# 字符串 '10' 不能被赋值给 int 类型的变量
# 虽然这个代码最终是可以执行的, 但是在编辑器中会报错
# 不必等到运行时, 就可以知道这会报错, 极大提升程序的健壮性
print(x)基本数据类型
python
# 整型
a: int = 10
# 浮点型:
b: float = 1.1
# 字符串
c: str = "abc"
# 布尔型
isInvalid: bool = False
# 联合类型
x: int | str | float = "1"
x = 1
x = 1.1
print(x)
# 列表(不限制组成元素)
lst1: list = [1, "a", False]
# 列表(限制组成元素)
names: list[str] = ["tom", "jerry", "spike"]
# 元组(不限制组成元素)
tpl1: tuple = (1, "2", 3.3, False)
# 元组(限制组成元素, 每个值都必须和类型一致)
tpl2: tuple[int, int, int] = (1, 2, 3)
tpl3: tuple[int, str, int] = (1, "2", 3)
# 字典(不限制组成元素)
dict1: dict = {1: "a", 2: "b", 3: "c"}
# 字典(限制组成元素)
# 不限制键值对的个数, 但是键值对类型必须符合标注
dict2: dict[str, int] = {
"x": 100,
"y": 200,
"z": 300,
}
# 函数
def sum(a: int, b: int) -> int:
return a + b
# 可变参数
def concat(*args: str) -> str:
result: str = ""
for arg in args:
result += arg
return result
# 多个返回值
def count_lists() -> tuple[int, int, int]:
return 1, 2, 3
# 没有返回值
def say_hello(name: str) -> None:
print(f"Hello, {name}!")自定义类
python
class A:
def __init__(self, name: str):
self.name = name
def get_name(self) -> str:
return self.name
def showAName(a: A):
print(a.get_name())
# 注意: 是传入实例, 不能这样 showAName(A)
showAName(A("tom"))
# 特殊情况: 类型是类本身, 此时必须加上 ""
class Node:
def __init__(self, prevNode="Node"):
self.prev = prevNode
self.next = None可调用的
python
from typing import Callable
def count(fn: Callable):
fn()
# 必须是可以调用的, 并且还限制了参数
# func: Callable[[int, int], int] 限制被装饰器修饰的函数 add
# -> Callable[[int, int], int] 限制装饰器返回的函数 wrapper
# Callable: 不限制参数和返回值
# Callable[[参数1类型, 参数2类型], 返回值类型]
def logger(func: Callable[[int, int], int]) -> Callable[[int, int], int]:
def wrapper(a: int, b: int):
print(f"Calling {func.__name__} with {a} and {b}")
result = func(a, b)
print(f"Returning {result}")
return result
return wrapper
@logger
def add(a: int, b: int) -> int:
return a + b
add(1, 2)没有返回值的
python
from typing import NoReturn
# 这个不叫没有返回值,它的返回值类型是 None
def say_hi() -> None:
print("Hi, I'm a Python function!")
# 这个异常退出执行的才是没有返回值
def error() -> NoReturn:
raise Exception("This is an error")确定的值
有些类似枚举, 但不是枚举, 枚举会在运行时报错
python
from typing import Literal
def say_gender(gender: Literal["male", "female"]):
print(f"You are a {gender}.")
say_gender("male")
say_gender("female")
# 虽然会编辑器报错, 但是可以正常运行
say_gender("man")
say_gender("women")