成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一日一技:Python類型標注的高級用法

開發 前端
如果傳入的參數是int類型的文章id,那么就返回這篇文章的詳情ArticleDetail對象。如果傳入的是文章列表,那么就返回ArticleDetail對象列表。

假設你正在寫后端代碼,其中一個函數的功能是傳入文章id,返回文章詳情。因為項目比較大,因此在定義函數時,把類型標注加上,標明了參數的類型和返回的類型。例如:

from typing import List
from dataclasses import dataclass


@dataclass
class ArticleDetail:
    id: int
    title: str
    content: str
    tag: List[str]


def query_article_detail(article_id: int) -> ArticleDetail:
    detail = ArticleDetail(
        id=article_id,
        title='文章標題',
        content='文章內容',
        tag=['tag1', 'tag2']
    )
    return detail


def test_query_article_detail():
    detail = query_article_detail(123)
    print(detail.content)

現在,當你拿到返回的detail變量時,IDE的自動補全就可以正常工作了,如下圖所示。

圖片圖片

你想讓這個函數支持批量查詢文章詳情的功能,代碼類似這樣:

def query_article_detail(article_id: int | List[int]) -> ArticleDetail | List[ArticleDetail]:
    if isinstance(article_id, int):
        detail = ArticleDetail(
            id=article_id,
            title='文章標題',
            cnotallow='文章內容',
            tag=['tag1', 'tag2']
        )
        return detail
    else:
        details = []
        for _id in article_id:
            detail = ArticleDetail(
                id=_id,
                title='文章標題',
                cnotallow='文章內容',
                tag=['tag1', 'tag2']
            )
            details.append(detail)
        return details

如果傳入的參數是int類型的文章id,那么就返回這篇文章的詳情ArticleDetail對象。如果傳入的是文章列表,那么就返回ArticleDetail對象列表。

現在問題來了,由于query_article_detail函數返回的數據類型不同,如何讓IDE的自動補全能夠正確提示呢?例如當我們傳入了一個文章id列表,但是卻直接讀取返回數據的.content屬性,在IDE上面看不出任何問題,如下圖所示。但顯然會報錯,因為此時的detail變量的值是一個列表。列表是沒有.content屬性的。

圖片圖片

有沒有什么辦法能夠讓IDE根據query_article_detail參數的類型,提示我們對返回數據的使用是否正確呢?

這個場景下,就可以使用Python的typing模塊中的@overload裝飾器,實現函數重載來提示。示例代碼如下:

from typing import List, overload
from dataclasses import dataclass


@dataclass
class ArticleDetail:
    id: int
    title: str
    content: str
    tag: List[str]


@overload
def query_article_detail(article_id: List[int]) -> List[ArticleDetail]:
    ...

@overload
def query_article_detail(article_id: int) -> ArticleDetail:
    ...


  def query_article_detail(article_id: int | List[int]) -> ArticleDetail | List[ArticleDetail]:
      if isinstance(article_id, int):
          detail = ArticleDetail(
              id=article_id,
              title='文章標題',
              cnotallow='文章內容',
              tag=['tag1', 'tag2']
          )
          return detail
      else:
          details = []
          for _id in article_id:
              detail = ArticleDetail(
                  id=_id,
                  title='文章標題',
                  cnotallow='文章內容',
                  tag=['tag1', 'tag2']
              )
              details.append(detail)
          return details

def test_query_article_detail():
    detail = query_article_detail([123, 456, 789])
    print(detail.)

在定義函數之前,先使用@overload裝飾器,裝飾兩次函數名。每一次使用不同的參數:

@overload
def query_article_detail(article_id: List[int]) -> List[ArticleDetail]:
    ...

@overload
def query_article_detail(article_id: int) -> ArticleDetail:
    ...

這兩個函數都是空函數,函數體用三個點代替。當然你也可以使用pass。而你真正的query_article_detail放到最下面。現在,當我們對detail對象使用自動補全時,IDE就能根據參數的類型來補全對應的值了。

當傳入參數是單個id時,如下圖所示:

圖片圖片

當傳入的參數是id列表時,如下圖所示:

圖片圖片

需要注意的時,所有重載的函數與真正執行的函數,函數名必須全部相同,如下圖所示:

圖片圖片

并且,真正實現功能的函數,必須放在重載函數的下面。

使用這種方式,以后即時別的文件導入并使用你這個函數,你也不用擔心它用錯數據類型了。

責任編輯:武曉燕 來源: 未聞Code
相關推薦

2021-04-05 14:47:55

Python多線程事件監控

2021-04-12 21:19:01

PythonMakefile項目

2021-04-27 22:15:02

Selenium瀏覽器爬蟲

2021-09-13 20:38:47

Python鏈式調用

2021-03-12 21:19:15

Python鏈式調用

2024-07-30 08:11:16

2024-07-30 08:16:18

Python代碼工具

2021-07-27 21:32:57

Python 延遲調用

2021-10-15 21:08:31

PandasExcel對象

2022-06-28 09:31:44

LinuxmacOS系統

2022-03-12 20:38:14

網頁Python測試

2025-05-28 03:15:00

Scrapy數據sleep

2023-10-29 09:16:49

代碼安全命令

2020-05-19 13:55:38

Python加密密碼

2024-02-20 22:13:48

Python項目Java

2021-04-23 21:40:33

Python優先級調度器

2023-10-28 12:14:35

爬蟲JavaScriptObject

2021-04-19 23:29:44

MakefilemacOSLinux

2024-11-11 00:38:13

Mypy靜態類型

2024-05-24 09:07:06

JSONprint字符串
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品久久电影 | 亚洲国产精品一区 | 波多野结衣电影一区 | 精品国产乱码久久久久久蜜臀 | 69精品久久久久久 | 亚洲精品在线免费观看视频 | 不卡的av电影 | 91新视频| 99精品久久久久久 | 日韩精品一区二区三区中文在线 | 久久精品这里精品 | 亚洲高清中文字幕 | 成年人在线观看视频 | 一级毛片视频在线 | 欧美一级久久 | 国产精品大片在线观看 | 午夜免费福利影院 | 亚洲欧美日韩精品久久亚洲区 | 欧美一区二区三区的 | 欧美自拍第一页 | 国产国拍亚洲精品av | 久久精品视频在线观看 | 国产精品视频97 | 亚洲福利片 | gav成人免费播放视频 | 亚洲男人天堂av | 国产亚洲www | 狠狠狠色丁香婷婷综合久久五月 | 成人国产精品久久 | 日韩在线免费视频 | 国产极品粉嫩美女呻吟在线看人 | 亚洲精品在线免费播放 | 久久i| 91精品国产乱码久久久久久久 | 国产91精品在线 | 视频一二区 | jvid精品资源在线观看 | www.久久久久久久久 | 一级爱爱片 | 一区二区三区四区av | 欧美黄色一区 |