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

Python中typing模塊的具體使用

 更新時間:2022年05月16日 15:11:16   作者:A-L-Kun  
本文主要介紹了Python中typing模塊的具體使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

typing庫

一、 簡介

Python是一門弱類型的語言,很多時候我們可能不清楚函數(shù)參數(shù)類型或者返回值類型,很有可能導(dǎo)致一些類型沒有指定方法,在寫完代碼一段時間后回過頭看代碼,很可能忘記了自己寫的函數(shù)需要傳什么參數(shù),返回什么類型的結(jié)果,就不得不去閱讀代碼的具體內(nèi)容,降低了閱讀的速度,typing模塊可以很好的解決這個問題

Python 運(yùn)行時并不強(qiáng)制標(biāo)注函數(shù)和變量類型。類型標(biāo)注可被用于第三方工具,比如類型檢查器、集成開發(fā)環(huán)境、靜態(tài)檢查器等

typing的主要作用有:

  • 類型檢查,防止運(yùn)行時出現(xiàn)參數(shù)、返回值類型不符
  • 作為開發(fā)文檔附加說明,方便使用者調(diào)用時傳入和返回參數(shù)類型
  • 模塊加入不會影響程序的運(yùn)行不會報正式的錯誤,pycharm支持typing檢查錯誤時會出現(xiàn)黃色警告

官方文檔:【https://docs.python.org/zh-cn/3/library/typing.html

語法:

def 函數(shù)名(參數(shù): 數(shù)據(jù)類型) -> 返回值類型:
? ? pass

變量名: 數(shù)據(jù)類型 = 值

二、 別名

1、 類型別名

要定義一個類型別名,可以將一個類型賦給別名。類型別名可用于簡化復(fù)雜類型簽名,同時類型別名適用于簡化復(fù)雜的類型簽名

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# @author: A.L.Kun
# @file : test.py
# @time : 2022/5/13 16:54
from typing import Sequence

ConnectionOptions = dict[str, int] ?# 表示字典中的鍵為字符串類型,值為整型
Address = tuple[str, int, ...] ?# 表示元組的第一個數(shù)據(jù)為字符串,第二個數(shù)據(jù)為整型,里面只能存儲兩個數(shù)據(jù),有省略號表示里面可以添加n個整型數(shù)據(jù)
Server = tuple[Address, ConnectionOptions]


def broadcast_message(message: str,
? ? ? ? ? ? ? ? ? ? ? servers: Sequence[Server] ?# 表示一個序列對象里面存儲了[tuple[tuple[str, int], dict[str, int]]]
? ? ? ? ? ? ? ? ? ? ? ) -> None: ?# 返回值為空
? ? ...

broadcast_message("a", [(("a", 1, 2), {"a": 1})])

2、 NewType

使用NewType輔助函數(shù)創(chuàng)建不同的類型,靜態(tài)類型檢查器會將新類型視為它是原始數(shù)據(jù)的子類,相當(dāng)于C++里面的`typedef

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# @author: A.L.Kun
# @file : test.py
# @time : 2022/5/13 16:54
from typing import NewType

UserId = NewType('UserId', int) ?# 其不會創(chuàng)建一個新的類或引入其他內(nèi)存,只是做一個約束作用


def name_by_id(user_id: UserId) -> str:
? ? ...


name_by_id(42) ?# Fails type check
name_by_id(UserId(42)) ?# OK

num = UserId(5) + 1 ?# type: int,可以進(jìn)行對應(yīng)數(shù)據(jù)類型的操作

同時,可以嵌套創(chuàng)建,即可以基于NewType創(chuàng)建NewType

3、 可調(diào)用對象

Callable[[Arg1Type, Arg2Type], ReturnType]

如,實現(xiàn)一個互斥鎖的裝飾器

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# @author: A.L.Kun
# @file : test.py
# @time : 2022/5/13 16:54
from collections.abc import Callable ?# 注意要使用Concatenate和ParamSpec就必須使用這個模塊里面的Callable
from threading import Lock
from typing import TypeVar
from pip._vendor.typing_extensions import Concatenate, ParamSpec ?# 導(dǎo)入typing的擴(kuò)展

P = ParamSpec('P') ?# 里面有args和kwargs參數(shù)
R = TypeVar('R') ?# 自定義數(shù)據(jù)類型

my_lock = Lock() ?# 創(chuàng)建一個互斥鎖


def with_lock(f: Callable[Concatenate[Lock, P], R]) -> Callable[P, R]:
? ? '''一個提供互斥鎖,使得線程安全的裝飾器'''
? ? def inner(*args: P.args, **kwargs: P.kwargs) -> R:
? ? ? ? return f(my_lock, *args, **kwargs)
? ? return inner


@with_lock
def sum_threadsafe(lock: Lock, numbers: list[float]) -> float:
? ? '''Add a list of numbers together in a thread-safe manner.'''
? ? with lock:
? ? ? ? return sum(numbers)


# We don't need to pass in the lock ourselves thanks to the decorator.
print(sum_threadsafe([1.1, 2.2, 3.3]))

無需指定調(diào)用簽名,用省略號字面量替換類型提示里的參數(shù)列表: Callable[..., ReturnType],就可以聲明可調(diào)對象的返回類型

與 Callable 和 ParamSpec 一起使用,對一個高階可調(diào)用對象進(jìn)行類型注釋,該對象可以增加、刪除或轉(zhuǎn)換另一個可調(diào)用對象的參數(shù)。 使用形式為Concatenate[Arg1Type, Arg2Type, ..., ParamSpecVariable]。 Concatenate 目前只在作為 Callable 的第一個參數(shù)時有效。Concatenate 的最后一個參數(shù)必須是一個 ParamSpec

三、 泛型支持

typing模快最基本的支持有Any ,Tuple,Callable,TypeVar 和 Generic類型組成

1、集合類型

from typing import (
    List,  # list的泛型版本。用于注釋返回類型。要注釋參數(shù),最好使用抽象集合類型,如Sequence或Iterable
    Set,  # set的泛型版本
    Dict  # dict 的泛型版本。對標(biāo)注返回類型比較有用。如果要標(biāo)注參數(shù)的話,使用如 Mapping 的抽象容器類型是更好的選擇
    )

2、 抽象基類

from typing import (
    Mapping,  # 要注釋函數(shù)參數(shù)中的Key-Value類型時,推薦使用的抽象集合類型
    Sequence,  # 要注釋函數(shù)參數(shù)中的序列例如列表類型時,推薦使用的抽象集合類型
    Iterable  # 要注釋函數(shù)參數(shù)中的迭代類型時,推薦使用的抽象集合類型
    )

3、 泛型

TypeVar:其就像C++里面的template一樣

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# @author: A.L.Kun
# @file : test.py
# @time : 2022/5/13 16:54
from typing import (
? ? Sequence,
? ? TypeVar ?# 限制多個變量為同一個數(shù)據(jù)類型
)

T = TypeVar('T') ?# Can be anything?
A = TypeVar('A', str, bytes) ?# Must be str or bytes?

def repeat(x: T, n: int) -> Sequence[T]:
? ? """Return a list containing n references to x."""
? ? return [x] * n

def longest(x: A, y: A) -> A:
? ? """Return the longest of two strings."""
? ? return x if len(x) >= len(y) else y

AnyStr

AnyStr是一個字符串和字節(jié)類型的特殊類型變量AnyStr = TypeVar('AnyStr', str, bytes),它用于可以接受任何類型的字符串而不允許不同類型的字符串混合的函數(shù)

4、 Any

特殊類型,表明類型沒有任何限制

  • 每一個類型都對 Any 兼容
  • Any 對每一個類型都兼容

Any 是一種特殊的類型。靜態(tài)類型檢查器將所有類型視為與Any兼容,反之亦然, Any也與所有類型相兼容。

這意味著可對類型為 Any 的值執(zhí)行任何操作或者方法調(diào)用并將其賦值給任意變量

如下所示,將 Any 類型的值賦值給另一個更具體的類型時,Python不會執(zhí)行類型檢查。例如,當(dāng)把 a 賦值給 s 時,即使 s 被聲明為 str類型,在運(yùn)行時接收到的是 int 值,靜態(tài)類型檢查器也不會報錯

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# @author: A.L.Kun
# @file : test.py
# @time : 2022/5/13 16:54
from typing import (
? ? Any,
? ? NoReturn, ?# 表示函數(shù)沒有返回值
)

def test(s: Any) -> NoReturn:
? ? s.item() ?# 不會檢測s里面是否有item()屬性

def test_(s: object) -> NoReturn:
? ? s.item() ?# 會檢測s里面是否有item屬性

當(dāng)參數(shù)無類型是,默認(rèn)為Any類型

5、 特殊形式

5.1 Type

一個注解為 C 的變量可以接受一個類型為 C 的值。相對地,一個注解為 Type[C] 的變量可以接受本身為類的值 。 更精確地說它接受 C的 類對象

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# @author: A.L.Kun
# @file : test.py
# @time : 2022/5/13 16:54
from typing import (
? ? Type,
)


class User:
? ? ...


class BasicUser(User):
? ? ...

# Accepts User, BasicUser, ...

def make_new_user(user_class: Type[User]) -> User:
? ? return user_class()


print(make_new_user(User))

5.2 Union

聯(lián)合類型;Union[X, Y]意味著:要么是 X,要么就是 Y。定義一個聯(lián)合類型,需要注意的有:

  • 參數(shù)必須是類型,而且必須至少有一個參數(shù)。
  • 能繼承或者實例化一個聯(lián)合類型。
  • Union[X, Y]不能寫成 Union[X][Y] 。
  • 可以使用 Optional[X] 作為Union[X, None]的縮寫- 聯(lián)合類型的聯(lián)合類型會被展開打平
  • 僅有一個參數(shù)的聯(lián)合類型會坍縮成參數(shù)自身,比如:
Union[int] == int  # The constructor actually returns int

多余的參數(shù)會被跳過,比如:

Union[int, str, int] == Union[int, str]

在比較聯(lián)合類型的時候,參數(shù)順序會被忽略,比如:

Union[int, str] == Union[str, int]

5.3 Optional

可選類型,Optional[X] 等價于Union[X, None]

5.4 Tuple

元組類型,Tuple[X, Y] 標(biāo)注了一個二元組類型,其第一個元素的類型為 X 且第二個元素的類型為Y??赵M的類型可寫作 Tuple[()]

為表達(dá)一個同類型元素的變長元組,使用省略號字面量,如Tuple[int, ...]。單獨(dú)的一個 Tuple 等價于 Tuple[Any, ...],進(jìn)而等價于tuple

示例: Tuple[int, float, str]表示一個由整數(shù)、浮點數(shù)和字符串組成的三元組

5.5 Callable

可調(diào)用類型;Callable[[int], str]是一個函數(shù),接受一個 int 參數(shù),返回一個str。下標(biāo)值的語法必須恰為兩個值:參數(shù)列表和返回類型。參數(shù)列表必須是一個類型和省略號組成的列表;返回值必須是單一一個類型

不存在語法來表示可選的或關(guān)鍵詞參數(shù),這類函數(shù)類型罕見用于回調(diào)函數(shù)。Callable[..., ReturnType](使用字面省略號)能被用于提示一個可調(diào)用對象,接受任意數(shù)量的參數(shù)并且返回 ReturnType。單獨(dú)的 Callable 等價于Callable[..., Any],并且進(jìn)而等價于 collections.abc.Callable

更多語法,請到官方查看?。?!

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

相關(guān)文章

  • python中json、字典的區(qū)別以及相互轉(zhuǎn)換方法

    python中json、字典的區(qū)別以及相互轉(zhuǎn)換方法

    在Python中我們經(jīng)常會用到JSON格式的數(shù)據(jù),而將JSON格式轉(zhuǎn)化為Python的字典類型是一種常見的操作,這篇文章主要給大家介紹了關(guān)于python中json、字典的區(qū)別以及相互轉(zhuǎn)換方法的相關(guān)資料,需要的朋友可以參考下
    2023-11-11
  • 使用Python的networkx繪制精美網(wǎng)絡(luò)圖教程

    使用Python的networkx繪制精美網(wǎng)絡(luò)圖教程

    今天小編就為大家分享一篇使用Python的networkx繪制精美網(wǎng)絡(luò)圖教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • Python?Bytes壓縮新手速成

    Python?Bytes壓縮新手速成

    掌握Python?Bytes壓縮的秘訣,讓你的數(shù)據(jù)輕裝上陣!本指南將帶你一探Bytes壓縮的奧秘,告別臃腫的數(shù)據(jù),快來發(fā)現(xiàn)如何讓你的代碼和應(yīng)用在性能高速公路上馳騁吧!
    2023-12-12
  • Python實現(xiàn)個人微信號自動監(jiān)控告警的示例

    Python實現(xiàn)個人微信號自動監(jiān)控告警的示例

    今天小編就為大家分享一篇Python實現(xiàn)個人微信號自動監(jiān)控告警的示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • python中numpy.zeros(np.zeros)的使用方法

    python中numpy.zeros(np.zeros)的使用方法

    下面小編就為大家?guī)硪黄猵ython中numpy.zeros(np.zeros)的使用方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11
  • Python實現(xiàn)迪杰斯特拉算法過程解析

    Python實現(xiàn)迪杰斯特拉算法過程解析

    這篇文章主要介紹了Python實現(xiàn)迪杰斯特拉算法過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-09-09
  • Python中文分詞庫jieba,pkusegwg性能準(zhǔn)確度比較

    Python中文分詞庫jieba,pkusegwg性能準(zhǔn)確度比較

    這篇文章主要介紹了Python中文分詞庫jieba,pkusegwg性能準(zhǔn)確度比較,需要的朋友可以參考下
    2020-02-02
  • Python繪制百分比堆疊柱狀圖并填充圖案

    Python繪制百分比堆疊柱狀圖并填充圖案

    這篇文章主要為大家詳細(xì)介紹了Python繪制百分比堆疊柱狀圖并填充圖案,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • Python實現(xiàn)21點小游戲的示例代碼

    Python實現(xiàn)21點小游戲的示例代碼

    1931年,當(dāng)美國內(nèi)華達(dá)州宣布賭博為合法活動時,21點游戲第一次公開出現(xiàn)在內(nèi)華達(dá)州的賭場俱樂部,15年內(nèi),它取代擲骰子游戲,而一舉成為非常流行的賭場莊家參與的賭博游戲。本文將用Python實現(xiàn)這一經(jīng)典游戲,感興趣的可以了解一下
    2022-09-09
  • python判斷兩個序列的成員是否一樣的實例代碼

    python判斷兩個序列的成員是否一樣的實例代碼

    在本篇文章里小編給大家整理了關(guān)于python判斷兩個序列的成員是否一樣的實例代碼,需要的朋友們參考下。
    2020-03-03

最新評論