Python模块Typing.overload的使用场景分析

 更新时间:2024年02月05日 09:52:46   作者:__walden  
在 Python 中,typing.overload 是一个用于定义函数重载的装饰器,函数重载是指在一个类中可以定义多个相同名字但参数不同的函数,使得在调用函数时可以根据参数的不同选择不同的函数执行,这篇文章主要介绍了Python模块Typing.overload的使用,需要的朋友可以参考下

一、 使用场景

Python3 >= 3.5

当一个函数被定义了规定的输入或输出的规定的数据类型时(即Function Annotation函数注解功能),只能输入或输出规定的 静态数据类型 。那么如果传入其他类型的数据时就会报错,如下:

def test(name: str) -> str:
    return f"hello {name}"
test(1)
 ... TypeError: must be str, not int

但这是运行时的错误,也就是代码在执行时才会发现问题。最好是我们能在写完代码时就发现是否存在问题。因此就有了类型检查工具,比如mypy这样的工具,还有很多IDE也集成了这样的检查工具。

那么如果就需要使用该函数,又需要输入或输出 动态数据类型 怎么办呢,所以引入了overload。

二、实现动态语言

解决以上问题又两种方案:

  • 1、使用typing.TypeVar
  • 2、使用typing.overload

2.1 TypeVar

先说第一种,对于固定数量参数的方法而言,同一个参数如果打算接受多种类型,可以这么用,比方说参数可以是:int, float, str:

from typing import TypeVar
T = TypeVar('T', int, float, str)
def test(name: T) -> str:
return f"hello {name}"
test(2)

这种方案更类似于静态语言中的interface的概念,定义一个通用的父类,这样的话,你可以传递子类型过去。

2.2 overload

overload翻译过来是 重载 的意思,Java中有这样的两个概念,重写(override)和重载(overload)。重写其实是在保证输入和输出不变的情况下重写实现逻辑。而重载则是允许修改输入和输出,即同一个方法名可以支持多种类型的输入和输出。

跟静态语言中还是很有差别的。

from typing import overload
@overload
def test(name: str) -> str:
...
@overload
def test(name: float) -> str:
...
@overload
def test(name: int, age: int) -> str:
...
def test(name, age=18):
 return f"hello {name}"
test(2)

通过定义多个同名函数,上面的同名函数需要通过overload装饰器装饰。可以看到被装饰的函数的输入类型和输出类型都可以更改。但是,最后一定要定义一个没有装饰器的同名函数 才能实现动态的效果。

这么用的作用是什么呢?文档中有一句话很重要:

“The @overload-decorated definitions are for the benefit of the type checker only, since they will be overwritten by the non-@overload-decorated definition, while the latter is used at runtime but should be ignored by a type checker. ”

翻译:被overload装饰的函数仅仅是为了受益于类型检查工具,因为它们会被没有overload装饰的函数定义覆盖,尽管未被装饰的函数是用于运行时的,但是会 被类型检查工具忽略

所以,看到这应该明白了,overload仅仅是给检查工具用的。但如果静态类型检查变成工程的一部分的话,这也会避免很多问题,在写代码时也会比心里有底。

补充:

python typing.overload

在 Python 中,typing.overload 是一个用于定义函数重载的装饰器。函数重载是指在一个类中可以定义多个相同名字但参数不同的函数,使得在调用函数时可以根据参数的不同选择不同的函数执行。这种机制可以增加代码的可读性和可维护性。在 Python 3.5 版本以后,引入了 typing.overload 模块来支持函数重载。

1. 为什么需要函数重载?

在很多编程语言中,函数的重载是一种常见的编程技术。它允许我们使用相同的函数名字来执行不同的操作,根据函数接收的参数类型和数量来确定具体执行哪个函数。这样可以使代码更加简洁和易于理解。

假设我们有一个函数 add,用于实现两个数字相加的操作。使用函数重载,我们可以定义多个版本的 add 函数,分别支持不同类型的参数。例如,我们可以定义一个 add 函数用于整数相加,另一个 add 函数用于浮点数相加。

2. typing.overload 的使用方法

在 Python 中使用 typing.overload 模块定义函数重载非常简单。我们只需要在函数的上方使用 @overload 装饰器,并在函数的下方使用 @overload 装饰器的实现。

下面是一个示例,演示了如何使用 typing.overload 定义一个 add 函数,实现整数和浮点数的相加操作:

from typing import overload
@overload
def add(a: int, b: int) -> int:
    pass
@overload
def add(a: float, b: float) -> float:
    pass
def add(a, b):
    return a + b

在上面的例子中,我们首先使用 @overload 装饰器定义了两个函数签名,分别表示整数相加和浮点数相加。然后,在函数的下方实现了一个通用的 add 函数,用于处理不同类型的参数。注意,在通用函数中,我们没有指定参数类型和返回类型。

3. 函数重载的实际应用

函数重载可以在很多场景中使用,特别是当我们需要实现一些具有复杂参数类型的函数时。下面是一些实际应用的例子:

3.1 数据类型转换

假设我们有一个函数 to_str,用于将不同类型的变量转换为字符串。我们可以使用函数重载来实现对不同类型的变量进行不同的转换操作。

from typing import overload
@overload
def to_str(value: int) -> str:
    pass
@overload
def to_str(value: float) -> str:
    pass
def to_str(value):
    return str(value)

3.2 集合操作

假设我们有一个函数 union,用于合并两个集合。我们可以使用函数重载来支持不同类型的集合合并。

from typing import List, overload
@overload
def union(a: List[int], b: List[int]) -> List[int]:
    pass
@overload
def union(a: List[str], b: List[str]) -> List[str]:
    pass
def union(a, b):
    return a + b

3.3 API 接口

假设我们有一个网络请求库,我们可以使用函数重载来支持不同类型的请求。

from typing import Dict, overload
@overload
def request(url: str, params: Dict[str, str]) -> str:
    pass
@overload
def request(url: str, data: bytes) -> bytes:
    pass
def request(url, params_or_data):
    # 实现网络请求
    pass

4. 总结

函数重载是一种常见的编程技术,在 Python 中可以使用 typing.overload 模块来实现。它可以提高代码的可读性和可维护性,同时还可以在处理不同类型的参数时提供更灵活的选择。在实际应用中,函数重载可以应用于数据类型转换、集合操作、API 接口等

到此这篇关于Python模块Typing.overload的使用的文章就介绍到这了,更多相关Python Typing.overload的使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python线程类改变类变量的操作代码

    python线程类改变类变量的操作代码

    这篇文章主要介绍了python线程类改变类变量的操作代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2024-01-01
  • Python多维/嵌套字典数据无限遍历的实现

    Python多维/嵌套字典数据无限遍历的实现

    下面小编就为大家带来一篇Python多维/嵌套字典数据无限遍历的实现。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-11-11
  • Python中的类学习笔记

    Python中的类学习笔记

    这篇文章主要介绍了Python中的类学习笔记,本文是个人学习总结,用实例讲解了类的定义、访问控制等内容,需要的朋友可以参考下
    2014-09-09
  • Python nonlocal关键字 与 global 关键字解析

    Python nonlocal关键字 与 global 关键字解析

    这篇文章主要介绍了Python nonlocal关键字 与 global 关键字解析,nonlocal关键字用来在函数或其他作用域中使用外层变量,global关键字用来在函数或其他局部作用域中使用全局变量,更多香瓜内容需要的小伙伴可以参考一下
    2022-03-03
  • python常用数据结构元组详解

    python常用数据结构元组详解

    这篇文章主要介绍了python常用数据结构元组详解,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-08-08
  • Python利用3D引擎做一个太阳系行星模拟器

    Python利用3D引擎做一个太阳系行星模拟器

    Python有一个不错的3D引擎——Ursina。本文就来利用Ursina这一3D引擎做一个太阳系行星模拟器,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-01-01
  • django channels使用和配置及实现群聊

    django channels使用和配置及实现群聊

    本文主要介绍了django channels使用和配置及实现群聊,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • 基于python中theano库的线性回归

    基于python中theano库的线性回归

    这篇文章主要为大家详细介绍了基于python中theano库的线性回归,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • 怎么快速自学python

    怎么快速自学python

    在本篇文章里小编给大家分享的是一篇关于怎么快速自学python的相关内容,有兴趣的朋友们可以学习参考下。
    2020-06-06
  • 解决python给列表里添加字典时被最后一个覆盖的问题

    解决python给列表里添加字典时被最后一个覆盖的问题

    今天小编就为大家分享一篇解决python给列表里添加字典时被最后一个覆盖的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-01-01

最新评论