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

相关推荐

  • C语言calloc()函数的使用方法及注意事项

    今天,我们将要一起探讨一个备受争议的话题——C语言calloc()函数的使用方法及注意事项。这个函数在网络互联网服务器行业中占据着非常重要的地位,它可以帮助我们有效地管理内存空间,…

    行业资讯 2024年4月17日
    0
  • 国产数据库调研

    01 数据库分类 近些年数据库发展迅速,新增了很多新的词汇,例如分布式数据库、云原生数据库、HTAP数据库、NewSQL数据库、自治数据库等,这些数据库并不完全都是是新型数据库,而…

    2024年4月2日
    0
  • 工信部投诉电话能投诉联通吗,工信部官网投诉网页联通

    那么,其他企业是否也会屏蔽工信部的投诉网站呢?这真是一个令人烦恼的问题。毕竟,如果其他运营商效仿并屏蔽您的URL,您将无法使用此渠道来解决出现的问题。 首先我们来看看中国联通为何屏…

    行业资讯 2024年5月15日
    0
  • 石家庄seo公司

    你是否听说过石家庄seo公司?也许你对这个行业并不陌生,但是它究竟是做什么的呢?今天,我将带你一起探索这个神秘的行业。从服务内容到客户案例,再到优势与特点,让我们一起来了解石家庄s…

    行业资讯 2024年4月16日
    0

发表回复

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