python 类型注解

 

概念

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

基本用法

变量类型注解:

name: str = "Alice"  # name 是一个字符串类型age: int = 30  # age 是一个整数类型

函数参数和返回值类型注解:

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

类型别名:

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

自定义类作为类型注解:

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

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

from typing import Uniondef calculate(a: Union[int, float], b: Union[int, float]) -> float:    return a + b

Optional:表示参数可以是某类型或None。

from typing import Optionaldef find_user(id: int) -> Optional[User]:    # 如果找不到用户,返回None    ...Any:可以是任意类型,一般尽量避免使用。Dict、List、Tuple、Set 等容器类型,可以指定元素的类型。

类型注解进阶使用

类方法与属性注解

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

from typing import ClassVar, Typeclass 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 Protocolclass 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 Anydef legacy_function(data: Any) -> None:  # data的类型不做检查    ...def complex_function(a, *, kwarg: str = "default") -> None:  # kwarg有默认值,但类型注解不影响函数签名    ...
第三方工具与静态类型检查

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

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

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

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

 

原创文章,作者:guozi,如若转载,请注明出处:https://www.sudun.com/ask/88949.html

(0)
guozi's avatarguozi
上一篇 2024年6月4日 下午3:19
下一篇 2024年6月4日 下午3:27

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注