【python 类型注解】

python 类型注解

概念

Python 类型注解(Type Annotations)是从Python 3.5 版本开始引入的一项特性,它允许开发者为变量、函数参数、返回值等提供类型提示。类型注解不会改变程序的实际运行行为,但能提高代码的可读性和便于静态分析工具、IDE 提供更好的代码补全和错误检查支持。Python 的类型注解使用类型提示(typing 模块)来实现。

基本用法

变量类型注解:

name: str = "Alice"  # name 是一个字符串类型
age: int = 30  # age 是一个整数类型
函数参数和返回值类型注解:

from typing import List, Tuple
def greet(name: str) -> str:  # name 参数是字符串类型,函数返回值也是字符串
    return f"Hello, {name}"
def add_numbers(a: int, b: int) -> int:  # a 和 b 都是整数类型,返回值也是整数
    return a + b
def process_data(data: List[int]) -> Tuple[int, str]:  # data 是整数列表,返回值是一个元组,第一个元素是整数,第二个是字符串
    total = sum(data)
    return total, "Processed"

类型别名与自定义类型

类型别名:

UserId = NewType('UserId', int)  # 创建一个新的类型别名,表示用户ID
def get_user_info(user_id: UserId):  # 使用类型别名作为参数类型
...

自定义类作为类型注解:

class User:
    def __init__(self, name: str, age: int):
        self.name = name
        self.age = age
def print_user_info(user: User):  # 使用自定义类作为参数类型
    print(f"Name: {user.name}, Age: {user.age}")

更复杂的类型注解

Union:表示参数可以是多种类型之一。

from typing import Union
def calculate(a: Union[int, float], b: Union[int, float]) -> float:
    return a + b
Optional:表示参数可以是某类型或Nonefrom typing import Optional
def find_user(id: int) -> Optional[User]:
    # 如果找不到用户,返回None
    ...
Any:可以是任意类型,一般尽量避免使用。
Dict、List、Tuple、Set 等容器类型,可以指定元素的类型。

类型注解进阶使用

类方法与属性注解

对于类的方法和属性,也可以使用类型注解来指定它们的类型或返回类型。这包括实例方法、静态方法和类方法。

from typing import ClassVar, Type
class Book:
    title: ClassVar[str]  # 类变量,所有实例共享,类型为字符串
    author: str  # 实例变量,每个实例独立,类型为字符串
    def __init__(self, title: str, author: str):
        self.title = title
        self.author = author
    def get_summary(self) -> str:  # 返回类型为字符串
        return f"{self.title} by {self.author}"
    @classmethod
    def from_dict(cls: Type['Book'], data: dict) -> 'Book':  # 类方法,cls指代类本身,返回类型为Book实例
        return cls(title=data['title'], author=data['author'])

协议与抽象基

协议与抽象基 3.8 引入了协议(Protocol),它是类型提示中的一种抽象基类,用于定义接口规范,而不需要继承。

from typing import Protocol
class Flyable(Protocol):
    def fly(self) -> None:
        ...
class Bird:
    def fly(self) -> None:
        print("Flying high!")
class Airplane:
    def fly(self) -> None:
        print("Taking off!")
def make_it_fly(obj: Flyable) -> None:
    obj.fly()
bird = Bird()
airplane = Airplane()
make_it_fly(bird)  # 正确
make_it_fly(airplane)  # 正确

类型忽略与忽略特定参数

有时你可能想明确地忽略某些参数的类型检查,可以使用Any或typing.TYPE_CHECKING。

from typing import Any
def legacy_function(data: Any) -> None:  # data的类型不做检查
    ...
def complex_function(a, *, kwarg: str = "default") -> None:  # kwarg有默认值,但类型注解不影响函数签名
...

第三方工具与静态类型检查

Mypy:是最流行的静态类型检查器,可以安装在开发环境中,帮助找出类型错误。

Pyright:Visual Studio Code 中的插件,提供了实时的类型检查和代码补全。

PyCharm:集成开发环境,内置了对类型注解的强大支持。

通过这些工具和实践,类型注解不仅能提高个人编码效率,也能提升团队协作的代码质量,减少因类型错误导致的Bug。不过,合理使用类型注解,避免过度注解导致代码可读性下降,保持代码的简洁与清晰是关键。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值