Python3中装饰器@typing.overload的使用
? ? ? typing.py的源碼在:https://github.com/python/cpython/blob/main/Lib/typing.py 。此模塊為類型提示(Type Hints)提供運行時支持。這里介紹下@typing.overload的使用,從python 3.5版本開始將Typing作為標準庫引入。
? ? ? python3中增加了Function Annotation(函數注解,能夠聲明類型)的功能,可以使用類型檢查工具如mypy達到類型靜態檢查的效果。
? ? ? @overload裝飾器可以修飾支持多種不同參數類型組合的函數和方法。一系列@overload-decorated定義必須緊跟一個非@overload-decorated定義(對于相同的函數/方法)。
? ? ? @overload-decorated定義僅是為了協助類型檢查工具,因為它們將被非@overload-decorated定義覆蓋,而后者在運行時會被類型檢查工具忽略。在運行時,直接調用@overload-decorated函數會引發NotImplementedError。
? ? ? 被裝飾的函數的輸入類型和輸出類型都可以更改,非@overload-decorated定義必須通用。
? ? ? 以下為測試代碼:
from typing import overload, Union
from typing_extensions import Literalvar = 2
if var == 1:# python3中增加了Function Annotation(函數注解,能夠聲明類型)的功能,可以使用類型檢查工具如mypy達到類型靜態檢查的效果def foo(name: str) -> str:return "csdn id:" + nameprint(foo("fengbingchun"))#print(foo(5)) # TypeError: can only concatenate str (not "int") to str
elif var == 2:# reference: https://stackoverflow.com/questions/59359943/python-how-to-write-typing-overload-decorator-for-bool-arguments-by-value# 被裝飾的函數的輸入類型和輸出類型都可以更改,非@overload-decorated定義必須通用# The first two overloads use Literal[...] so we can have precise return types:@overloaddef myfunc(arg: Literal[True]) -> str: ...@overloaddef myfunc(arg: Literal[False]) -> int: ...# The last overload is a fallback in case the caller provides a regular bool@overloaddef myfunc(arg: bool) -> Union[str, int]: # Union[str, int] == str | int...def myfunc(arg:bool) -> Union[int, str]:if arg: return "something"else: return 0print(myfunc(True))print(myfunc(False))# Variables declared without annotations will continue to have an inferred type of 'bool'variable = Trueprint(myfunc(variable))print("test finish")
? ? ? GitHub:https://github.com/fengbingchun/Python_Test
總結
以上是生活随笔為你收集整理的Python3中装饰器@typing.overload的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用Windows7上的VS Code打
- 下一篇: PyTorch中nn.Module类简介