中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python中typing模塊怎么使用

發布時間:2022-05-17 09:14:42 來源:億速云 閱讀:152 作者:iii 欄目:開發技術

這篇文章主要介紹“Python中typing模塊怎么使用”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Python中typing模塊怎么使用”文章能幫助大家解決問題。

typing庫

一、 簡介

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

Python 運行時并不強制標注函數和變量類型。類型標注可被用于第三方工具,比如類型檢查器、集成開發環境、靜態檢查器等

typing的主要作用有:

  • 類型檢查,防止運行時出現參數、返回值類型不符

  • 作為開發文檔附加說明,方便使用者調用時傳入和返回參數類型

  • 模塊加入不會影響程序的運行不會報正式的錯誤,pycharm支持typing檢查錯誤時會出現黃色警告

語法:

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

變量名: 數據類型 = 值

二、 別名

1、 類型別名

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

#!/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, ...]  # 表示元組的第一個數據為字符串,第二個數據為整型,里面只能存儲兩個數據,有省略號表示里面可以添加n個整型數據
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輔助函數創建不同的類型,靜態類型檢查器會將新類型視為它是原始數據的子類,相當于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)  # 其不會創建一個新的類或引入其他內存,只是做一個約束作用


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,可以進行對應數據類型的操作

同時,可以嵌套創建,即可以基于NewType創建NewType

3、 可調用對象

Callable[[Arg1Type, Arg2Type], ReturnType]

如,實現一個互斥鎖的裝飾器

#!/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  # 導入typing的擴展

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

my_lock = Lock()  # 創建一個互斥鎖


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]))

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

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

三、 泛型支持

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

1、集合類型

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

2、 抽象基類

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

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  # 限制多個變量為同一個數據類型
)

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是一個字符串和字節類型的特殊類型變量AnyStr = TypeVar('AnyStr', str, bytes),它用于可以接受任何類型的字符串而不允許不同類型的字符串混合的函數

4、 Any

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

  • 每一個類型都對 Any 兼容

  • Any 對每一個類型都兼容

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

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

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

#!/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,  # 表示函數沒有返回值
)

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

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

當參數無類型是,默認為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

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

  • 參數必須是類型,而且必須至少有一個參數。

  • 能繼承或者實例化一個聯合類型。

  • Union[X, Y]不能寫成 Union[X][Y] 。

  • 可以使用 Optional[X] 作為Union[X, None]的縮寫- 聯合類型的聯合類型會被展開打平

  • 僅有一個參數的聯合類型會坍縮成參數自身,比如:

Union[int] == int  # The constructor actually returns int

多余的參數會被跳過,比如:

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

在比較聯合類型的時候,參數順序會被忽略,比如:

Union[int, str] == Union[str, int]
5.3 Optional

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

5.4 Tuple

元組類型,Tuple[X, Y] 標注了一個二元組類型,其第一個元素的類型為 X 且第二個元素的類型為Y。空元組的類型可寫作 Tuple[()]

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

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

5.5 Callable

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

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

關于“Python中typing模塊怎么使用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

松潘县| 邵武市| 勐海县| 尉犁县| 仙桃市| 云龙县| 阿拉尔市| 灵寿县| 高平市| 扎囊县| 枝江市| 无锡市| 延安市| 桂阳县| 新宾| 青岛市| 连山| 山西省| 南阳市| 翼城县| 东辽县| 鄢陵县| 深圳市| 榕江县| 华宁县| 伊宁市| 大荔县| 昌吉市| 潼南县| 浦县| 泰和县| 新密市| 昔阳县| 屯门区| 灵丘县| 靖西县| 虹口区| 积石山| 弥勒县| 连江县| 奇台县|