欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python模塊Typing.overload的使用場景分析

 更新時(shí)間:2024年02月05日 09:52:46   作者:__walden  
在 Python 中,typing.overload 是一個(gè)用于定義函數(shù)重載的裝飾器,函數(shù)重載是指在一個(gè)類中可以定義多個(gè)相同名字但參數(shù)不同的函數(shù),使得在調(diào)用函數(shù)時(shí)可以根據(jù)參數(shù)的不同選擇不同的函數(shù)執(zhí)行,這篇文章主要介紹了Python模塊Typing.overload的使用,需要的朋友可以參考下

一、 使用場景

Python3 >= 3.5

當(dāng)一個(gè)函數(shù)被定義了規(guī)定的輸入或輸出的規(guī)定的數(shù)據(jù)類型時(shí)(即Function Annotation函數(shù)注解功能),只能輸入或輸出規(guī)定的 靜態(tài)數(shù)據(jù)類型 。那么如果傳入其他類型的數(shù)據(jù)時(shí)就會(huì)報(bào)錯(cuò),如下:

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

但這是運(yùn)行時(shí)的錯(cuò)誤,也就是代碼在執(zhí)行時(shí)才會(huì)發(fā)現(xiàn)問題。最好是我們能在寫完代碼時(shí)就發(fā)現(xiàn)是否存在問題。因此就有了類型檢查工具,比如mypy這樣的工具,還有很多IDE也集成了這樣的檢查工具。

那么如果就需要使用該函數(shù),又需要輸入或輸出 動(dòng)態(tài)數(shù)據(jù)類型 怎么辦呢,所以引入了overload。

二、實(shí)現(xiàn)動(dòng)態(tài)語言

解決以上問題又兩種方案:

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

2.1 TypeVar

先說第一種,對于固定數(shù)量參數(shù)的方法而言,同一個(gè)參數(shù)如果打算接受多種類型,可以這么用,比方說參數(shù)可以是:int, float, str:

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

這種方案更類似于靜態(tài)語言中的interface的概念,定義一個(gè)通用的父類,這樣的話,你可以傳遞子類型過去。

2.2 overload

overload翻譯過來是 重載 的意思,Java中有這樣的兩個(gè)概念,重寫(override)和重載(overload)。重寫其實(shí)是在保證輸入和輸出不變的情況下重寫實(shí)現(xiàn)邏輯。而重載則是允許修改輸入和輸出,即同一個(gè)方法名可以支持多種類型的輸入和輸出。

跟靜態(tài)語言中還是很有差別的。

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)

通過定義多個(gè)同名函數(shù),上面的同名函數(shù)需要通過overload裝飾器裝飾??梢钥吹奖谎b飾的函數(shù)的輸入類型和輸出類型都可以更改。但是,最后一定要定義一個(gè)沒有裝飾器的同名函數(shù) 才能實(shí)現(xiàn)動(dòng)態(tài)的效果。

這么用的作用是什么呢?文檔中有一句話很重要:

“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裝飾的函數(shù)僅僅是為了受益于類型檢查工具,因?yàn)樗鼈儠?huì)被沒有overload裝飾的函數(shù)定義覆蓋,盡管未被裝飾的函數(shù)是用于運(yùn)行時(shí)的,但是會(huì) 被類型檢查工具忽略 。

所以,看到這應(yīng)該明白了,overload僅僅是給檢查工具用的。但如果靜態(tài)類型檢查變成工程的一部分的話,這也會(huì)避免很多問題,在寫代碼時(shí)也會(huì)比心里有底。

補(bǔ)充:

python typing.overload

在 Python 中,typing.overload 是一個(gè)用于定義函數(shù)重載的裝飾器。函數(shù)重載是指在一個(gè)類中可以定義多個(gè)相同名字但參數(shù)不同的函數(shù),使得在調(diào)用函數(shù)時(shí)可以根據(jù)參數(shù)的不同選擇不同的函數(shù)執(zhí)行。這種機(jī)制可以增加代碼的可讀性和可維護(hù)性。在 Python 3.5 版本以后,引入了 typing.overload 模塊來支持函數(shù)重載。

1. 為什么需要函數(shù)重載?

在很多編程語言中,函數(shù)的重載是一種常見的編程技術(shù)。它允許我們使用相同的函數(shù)名字來執(zhí)行不同的操作,根據(jù)函數(shù)接收的參數(shù)類型和數(shù)量來確定具體執(zhí)行哪個(gè)函數(shù)。這樣可以使代碼更加簡潔和易于理解。

假設(shè)我們有一個(gè)函數(shù) add,用于實(shí)現(xiàn)兩個(gè)數(shù)字相加的操作。使用函數(shù)重載,我們可以定義多個(gè)版本的 add 函數(shù),分別支持不同類型的參數(shù)。例如,我們可以定義一個(gè) add 函數(shù)用于整數(shù)相加,另一個(gè) add 函數(shù)用于浮點(diǎn)數(shù)相加。

2. typing.overload 的使用方法

在 Python 中使用 typing.overload 模塊定義函數(shù)重載非常簡單。我們只需要在函數(shù)的上方使用 @overload 裝飾器,并在函數(shù)的下方使用 @overload 裝飾器的實(shí)現(xiàn)。

下面是一個(gè)示例,演示了如何使用 typing.overload 定義一個(gè) add 函數(shù),實(shí)現(xiàn)整數(shù)和浮點(diǎn)數(shù)的相加操作:

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 裝飾器定義了兩個(gè)函數(shù)簽名,分別表示整數(shù)相加和浮點(diǎn)數(shù)相加。然后,在函數(shù)的下方實(shí)現(xiàn)了一個(gè)通用的 add 函數(shù),用于處理不同類型的參數(shù)。注意,在通用函數(shù)中,我們沒有指定參數(shù)類型和返回類型。

3. 函數(shù)重載的實(shí)際應(yīng)用

函數(shù)重載可以在很多場景中使用,特別是當(dāng)我們需要實(shí)現(xiàn)一些具有復(fù)雜參數(shù)類型的函數(shù)時(shí)。下面是一些實(shí)際應(yīng)用的例子:

3.1 數(shù)據(jù)類型轉(zhuǎn)換

假設(shè)我們有一個(gè)函數(shù) to_str,用于將不同類型的變量轉(zhuǎn)換為字符串。我們可以使用函數(shù)重載來實(shí)現(xiàn)對不同類型的變量進(jìn)行不同的轉(zhuǎn)換操作。

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 集合操作

假設(shè)我們有一個(gè)函數(shù) union,用于合并兩個(gè)集合。我們可以使用函數(shù)重載來支持不同類型的集合合并。

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 接口

假設(shè)我們有一個(gè)網(wǎng)絡(luò)請求庫,我們可以使用函數(shù)重載來支持不同類型的請求。

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):
    # 實(shí)現(xiàn)網(wǎng)絡(luò)請求
    pass

4. 總結(jié)

函數(shù)重載是一種常見的編程技術(shù),在 Python 中可以使用 typing.overload 模塊來實(shí)現(xiàn)。它可以提高代碼的可讀性和可維護(hù)性,同時(shí)還可以在處理不同類型的參數(shù)時(shí)提供更靈活的選擇。在實(shí)際應(yīng)用中,函數(shù)重載可以應(yīng)用于數(shù)據(jù)類型轉(zhuǎn)換、集合操作、API 接口等

到此這篇關(guān)于Python模塊Typing.overload的使用的文章就介紹到這了,更多相關(guān)Python Typing.overload的使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于python實(shí)現(xiàn)查詢ip地址來源

    基于python實(shí)現(xiàn)查詢ip地址來源

    這篇文章主要介紹了基于python實(shí)現(xiàn)查詢ip地址來源,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • 利用Python批量循環(huán)讀取Excel的技巧分享

    利用Python批量循環(huán)讀取Excel的技巧分享

    這篇文章主要為大家詳細(xì)介紹了何用Python批量循環(huán)讀取Excel,文中的示例代碼講解詳細(xì),對我們的學(xué)習(xí)或工作有一定的幫助,感興趣的可以了解一下
    2023-07-07
  • Python中g(shù)lobal關(guān)鍵字的用法詳解

    Python中g(shù)lobal關(guān)鍵字的用法詳解

    Python是一種簡單而強(qiáng)大的編程語言,提供了許多功能和語法來幫助開發(fā)人員編寫高效的代碼,其中一個(gè)常用的功能是使用global關(guān)鍵字來在函數(shù)內(nèi)部訪問和修改全局變量,在本文中,我們將深入探討Python中g(shù)lobal關(guān)鍵字的用法,以及使用它的一些最佳實(shí)踐
    2023-12-12
  • Python3.10和Python3.9版本之間的差異介紹

    Python3.10和Python3.9版本之間的差異介紹

    大家好,本篇文章主要講的是Python3.10和Python3.9版本之間的差異介紹,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下哦
    2021-12-12
  • python基于itchat實(shí)現(xiàn)微信群消息同步機(jī)器人

    python基于itchat實(shí)現(xiàn)微信群消息同步機(jī)器人

    本篇文章主要介紹了python基于itchat實(shí)現(xiàn)微信群消息同步機(jī)器人,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-02-02
  • 一篇文章徹底搞懂Python魔法參數(shù)args和kwargs(通俗易懂)

    一篇文章徹底搞懂Python魔法參數(shù)args和kwargs(通俗易懂)

    這篇文章主要介紹了Python中的*args和**kwargs,它們分別是可變位置參數(shù)和可變關(guān)鍵字參數(shù),文章通過實(shí)際例子展示了如何在函數(shù)、裝飾器等場景中使用*args和**kwargs,幫助讀者理解并掌握這些靈活的參數(shù)處理方式,需要的朋友可以參考下
    2025-02-02
  • 利用Python爬蟲爬取金融期貨數(shù)據(jù)的案例分析

    利用Python爬蟲爬取金融期貨數(shù)據(jù)的案例分析

    從技術(shù)角度來看,經(jīng)過一步步解析,任務(wù)是簡單的,入門requests爬蟲及入門pandas數(shù)據(jù)分析就可以完成,本文重點(diǎn)給大家介紹Python爬蟲爬取金融期貨數(shù)據(jù)的案例分析,感興趣的朋友一起看看吧
    2022-06-06
  • pygame實(shí)現(xiàn)貪吃蛇游戲(上)

    pygame實(shí)現(xiàn)貪吃蛇游戲(上)

    這篇文章主要為大家詳細(xì)介紹了pygame實(shí)現(xiàn)貪吃蛇游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • Python光學(xué)仿真wxpython透鏡演示系統(tǒng)初始化與參數(shù)調(diào)節(jié)

    Python光學(xué)仿真wxpython透鏡演示系統(tǒng)初始化與參數(shù)調(diào)節(jié)

    這篇文章主要為大家介紹了Python光學(xué)仿真wxpython透鏡演示系統(tǒng)的初始化與參數(shù)調(diào)節(jié),同樣在學(xué)習(xí)wxpython透鏡演示系統(tǒng)的入門同學(xué)可以借鑒參考下,希望能夠有所幫助
    2021-10-10
  • Python設(shè)計(jì)模式之門面模式簡單示例

    Python設(shè)計(jì)模式之門面模式簡單示例

    這篇文章主要介紹了Python設(shè)計(jì)模式之門面模式,簡單描述了門面模式的概念、原理,并結(jié)合實(shí)例形式給出了Python定義與使用門面模式的具體操作技巧,需要的朋友可以參考下
    2018-01-01

最新評論