網站首頁 編程語言 正文
function annotation 寫法:
- 使用冒號?
:
?加類型代表參數類型- 默認值參數示例:
b: int = 2
- 默認值參數示例:
- 使用?
->
?加類型代表返回值類型
python解釋器運行時并不會檢查類型,類型不對也不會拋異常,僅僅是注解而已。示例:
def plus(a: int, b: int = 2) -> int: return a + b
python 解析器并不會在意類型注解,嚴格來說這是不對的,Python 會把類型信息放在?__annotations__
?屬性中:
>>> def foo(a: str): ... print('hello', a) ... >>> foo.__annotations__ {'a': str} >>> class Bar: ... a: str ... b: int >>> Bar.__annotations__ {'a': str, 'b': int}
typing模塊
內置提供的類型:int
?、str
?、float
,typing模塊提供的類型:Dict
?、List
?、Tuble
...
typing使用方括號?Dict[str, int]
?而不是圓括號?Dict(str, int)
Dict
Dict[str, int]: 表示一個 keys 的類型為 str,values 的類型為 int 的字典,比如 {"a": 1, "b": 2}
from typing import Dict Dict[str, Dict[str, List[str]]]如下: { '原木鎮': { '第一小學': ['張偉', '王偉', '王芳'], '第二小學': ['李偉', '李娜'], }, '鴿子鎮': { '高山中學': ['張敏', '李靜'], '億百中學': ['王靜'] '蟒蛇小學': ['劉偉', '王秀英'] } }
List
List[int] 表示由整型組成的列表,比如[0, 1, 1, 2, 3]
List[List[int]] = [[1, 2], [2, 3]]
Tuple
Tuple[int, float, str] is a tuple of an int, a float and a string.
person: Tuple[str, int, float] = ('Mike', 22, 1.75)
set/AbstractSet
根據官方文檔,Set 推薦用于注解返回類型,AbstractSet 用于注解參數
def describe(s: AbstractSet[int]) -> Set[int]: return set(s)
Sequence
Sequence,是 collections.abc.Sequence 的泛型,在某些情況下,我們可能并不需要嚴格區分一個變量或參數到底是列表 list 類型還是元組 tuple 類型,我們可以使用一個更為泛化的類型,叫做 Sequence,其用法類似于 List
def square(elements: Sequence[float]) -> List[float]: return [x ** 2 for x in elements]
NoReturn
NoReturn,當一個方法沒有返回結果時,為了注解它的返回類型,我們可以將其注解為NoReturn
def hello() -> NoReturn: print('hello')
Any
Any,可以代表所有類型,所有的無參數類型注解和返回類型注解的都會默認使用 Any 類型,以下兩個函數等價:
def add(a): return a + 1 def add(a: Any) -> Any: return a + 1
TypeVar
TypeVar,自定義兼容特定類型的變量,比如有的變量聲明為 int、float、None 都是符合要求的,實際就是代表任意的數字或者空內容都可以,其他的類型則不可以,比如列表 list、字典 dict 等等,像這樣的情況,我們可以使用 TypeVar 來表示。
height = 1.75 Height = TypeVar('Height', int, float, None) def get_height() -> Height: return height
NewType
newType,聲明一些具有特殊含義的類型,像 Tuple 的例子一樣,我們需要將它表示為 Person,即一個人的含義,但但從表面上聲明為 Tuple 并不直觀,所以我們可以使用 NewType 為其聲明一個類型,如:
Person = NewType('Person', Tuple[str, int, float]) person = Person(('Mike', 22, 1.75))
實際上 person 就是一個 tuple 類型,我們可以對其像 tuple 一樣正常操作。
Callable
Callable,可調用類型,通常用來注解一個方法, 在聲明的時候需要使用?Callable[[Arg1Type, Arg2Type, ...], ReturnType]
?這樣的類型注解,將參數類型和返回值類型都要注解出來,例如:
def date(year: int, month: int, day: int) -> str: return f'{year}-{month}-{day}' def get_date_fn() -> Callable[[int, int, int], str]: return date
-> Callable[[int, int, int], str]: 中括號內分別標記了返回的方法的參數類型和返回值類型。
Union
Union,聯合類型,Union[X, Y]
?代表要么是 X 類型,要么是 Y 類型。
Union[Union[int, str], float] == Union[int, str, float] Union[int] == int Union[int, str, int] == Union[int, str] # 無參數順序 Union[int, str] == Union[str, int]
在一些方法參數聲明的時候比較有用,比如一個方法,要么傳一個字符串表示的方法名,要么直接把方法傳過來:
def process(fn: Union[str, Callable]): if isinstance(fn, str): # str2fn and process pass elif isinstance(fn, Callable): fn()
這樣的聲明在一些類庫方法定義的時候十分常見。
Optional
Optional,意思是說這個參數可以為空或已經聲明的類型,即?Optional[X]
?等價于?Union[X, None]
。
Optional 并不等價于可選參數,當它作為參數類型注解的時候,不代表這個參數可以不傳遞,而是說這個參數可以傳None,不傳也會報錯。
當一個方法執行結果,如果執行完畢就不返回錯誤信息, 如果發生問題就返回錯誤信息,則可以這么聲明:
def judge(result: bool) -> Optional[str]: if result: return 'Error Occurred'
Generator
Generator,想代表一個生成器類型,可以使用 Generator,它的聲明比較特殊,其后的中括號緊跟著三個參數,分別代表 YieldType、SendType、ReturnType,如:
def echo_round() -> Generator[int, float, str]: sent = yield 0 while sent >= 0: sent = yield round(sent) return 'Done'
在這里 yield 關鍵字后面緊跟的變量的類型就是 YieldType,yield 返回的結果的類型就是 SendType,最后生成器 return 的內容就是 ReturnType。
當然很多情況下,生成器往往只需要 yield 內容就夠了,我們是不需要 SendType 和 ReturnType 的,可以將其設置為空,如:
def infinite_stream(start: int) -> Generator[int, None, None]: while True: yield start start += 1
總結
原文鏈接:https://www.cnblogs.com/KbMan/p/12095857.html
相關推薦
- 2022-07-09 利用Python上傳日志并監控告警的方法詳解_python
- 2022-11-28 pytorch?dataset實戰案例之讀取數據集的代碼_python
- 2022-09-30 Docker容器Consul部署概述_docker
- 2022-05-26 解決redis批量刪除key值的問題_Redis
- 2022-08-23 Asp.net?core利用dynamic簡化數據庫訪問_實用技巧
- 2023-02-12 JetpackCompose?Navigation導航實現流程_Android
- 2022-09-24 pytorch使用nn.Moudle實現邏輯回歸_python
- 2022-12-08 C#與C++?dll之間傳遞字符串string?wchar_t*?char*?IntPtr問題_C#
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支