Python 代碼智能感知 —— 類型標註與特殊的註釋(獻給所有的Python人)

来源:https://www.cnblogs.com/xiaokang2022/archive/2022/09/19/16709118.html
-Advertisement-
Play Games

【原文地址:https://xiaokang2022.blog.csdn.net/article/details/126936985】 ​ 一個不會寫好的類型標註和註釋的Python程式員,是讓使用TA的代碼的人都痛苦無比的事情…… —— 某某大佬 一、代碼智能感知 想必大部分現代的集成開發環境(I ...


【原文地址:https://xiaokang2022.blog.csdn.net/article/details/126936985


一個不會寫好的類型標註註釋的Python程式員,是讓使用TA的代碼的人都痛苦無比的事情……

—— 某某大佬

一、代碼智能感知

        想必大部分現代的集成開發環境(IDE)都有代碼智能感知功能吧!

        智能感知(IntelliSense),就是在我們寫代碼的時候,代碼編輯器自動彈出我們代碼中需要補全的部分,而這些補全的部分就是代碼編輯器通過智能感知得到的,最重要的是,代碼編輯器智能地感知補全的部分是通過代碼中的變數的類型來得到的。


說了這麼多之後,大家一定都清楚智能感知是什麼了,但有些時候,代碼卻沒有智能感知(如下)


當代碼量很大的時候,代碼的智能感知是十分重要的,它可以幫你迅速瞭解到這個變數那個變數是個什麼東西,以減少你生產BUG!

        寫一個好的註釋(或者類型標註),不僅僅是方便未來複用你代碼的人,也是為了自己,實際上,“為了自己”可不只是簡單的方便自己瞭解代碼,更多的是讓IDE智能地感知到你的代碼,IDE理解了你的代碼,它就會為你提供對應的信息(如代碼補全和提示作用),這對程式員是極其友好的!

通過瞭解後面的類型標註特殊的註釋,你將解決幾乎所有的智能感知失效的問題! 

二、類型標註

Python的類型標註有幾種,在下麵我給出我所知道的一些

函數參數的類型標註 

【簡單操作】

1 def function(num: int, string: str):
2     pass

在上面的代碼中,函數參數的後面跟了一個冒號和一個類名,代表參數的數據類型,這個類名可以是內置的類,如str、int、float等,也可以是自己定義的類、也可以是模塊、庫中的類,如tkinter.Tk

num參數是int類型的,string參數是str類型的,這些類型標註不僅僅在函數被定義的地方可以被看見,在調用該函數的時候也能通過IDE的智能感知而被看見(如下)


這個類型標註之後,並不會強制該參數使用該類型,它只是起提示作用,相當於註釋,同時,IDE會通過智能感知該類型標註,給出相應的代碼提示


【高級操作】

1 import typing
2 
3 def function(num: int,
4              lis: list[int],
5              key: typing.Literal[4, 5, 6],
6              string: str | None = '123'):
7     pass

上面的代碼中:

list[int] 的意思是,lis參數的數據類型為一個內含整數數據的列表類型

typing是一個官方的內置模塊,專門用於類型標註,typing.Literal[4, 5, 6] 表示參數key的預期值只能為4或者5或者6,也就是說,該函數接收的key參數,它只希望它是4、5或者6這三個值中的一個

str | None 的意思是,string參數的數據類型可以為str或者是None類型,此處說明一下,類型標註中用 “|” 代表或者的這種操作是在 Python3.10 的時候才加入的,在之前的版本中,這種用法只在 pyi 文件(Python存根文件)中可以用

下麵的代碼提示中,我們就能看到類似於上面的類型標註的作用


順便一提,那個省略號(三個連續的小數點)的意思的預設值(一般用於pyi存根文件中)

函數返回值的類型標註

1 def pow(m: int, n: int) -> int:
2     return m**n

函數返回值的類型標註類似於上面所說的參數類型標註,只不過這裡標註的類型只的是函數的返回值的數據類型,同樣的,只起提示作用,沒有強制效果

這個標註也有高級用法,與上面的完全,一樣,此處不再贅述

順便一提,list[int, int, int] 表示一個含有三個整數數據的列表類型

變數的類型標註

傳言有一種從天而降的寫法,不知大家見過沒有

1 key: int
2 key = 3
3 
4 """
5 或者這樣寫:
6 key: int = 3
7 """
8 
9 print(key) # 輸出3

這個變數名後面加一個冒號、再加一個類名的寫法也是類型標註的一種,只不過它不是函數的參數,而是一般變數而已,用法同上

那麼,這個類型標註有什麼用呢?直接賦值給該變數一個列表,那麼IDE不也能識別它麽?

這對於一般的變數確實沒啥用,但是,下麵的這種操作,你可看好了


上面的這種情況,當變數沒有提前做好類型標註時,後面寫代碼就因為沒有IDE的提示而極其麻煩

變數的類型標註還有一種方法,將在後面的 特殊的註釋 中講到

三、特殊的註釋

一段看似普通的註釋,實際也有著特殊的作用,就像C#中的特殊註釋一樣(三條斜杠“///”),Python也有著它特殊的註釋

【三引號註釋】

想必一個合格的Python程式員,都知道三引號註釋的特殊作用吧

它不僅僅是一段普通的註釋,它可以換行(都知道的),它寫在函數和類下麵表示幫助文檔等等……這裡就不再贅述了

【特殊的 # 註釋】

它只能單行註釋……除此之外難道它還有別的特性???對!別的特性!

當 # 註釋以這樣一種格式寫的時候,它有著和類型標註同樣的效果!!!

1 key = [] # type: list[float]

# 註釋後面寫上 type,再加一個冒號、然後加上數據類型,它就成了類型標註!!!


是不是大多數人都不知道這個特性呢?

四、特殊的類型

有一些比較特別的數據類型,有些不是內置的但又算是內置的,但你又不容易找到它,比如迭代器類型、生成器類型、函數類型(Python里函數實際也是個對象,也有類型)等等,下麵給出一個表格方便大家進行類型的標註

類型名稱 數據類型 引用方式
函數 function

function

types.FunctionType

方法 method

types.MethodType

迭代器 Iterator

typing.Iterator

collections.abc.Iterator

生成器 Generator

typing.Generator

collections.abc.Generator

序列 Sequence

typing.Sequence

collections.abc.Sequence


【看了這麼多,是不是感覺又漲知識了呢?那麼,你的贊呢?】 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 隨著需求開發迭代,代碼庫規模逐漸變大,新的團隊成員引入等諸多因素,系統起初制定的架構規則不可避免遭到破壞。不僅僅是破壞團隊的統一開發規範,更為重要的是隨著代碼庫規模逐漸增長,大大降低系統的可維護性、擴展性,增加評審複雜度和重構成本,也最終導致團隊生產力下降以及研發成本增長。 在敏捷開發環境下,系統... ...
  • 摘要:零售企業就需要安全、可信、開放、能力強大的PaaS集成平臺支撐自身的雲業務,同樣也需要一個強大的業務系統來承載業務。 疫情又來了,買買買,趕緊囤。 這麼快沒貨了? 疫情反覆態勢之下,消費者體驗到的商品到達速度和多樣的產品選擇,以及平臺面臨的跨區調貨和各種渠道的線上流量突增等現狀,使得消費品及零 ...
  • 限流:使用Redisson的RRateLimiter進行限流 多策略:map+函數式介面優化if判斷 自定義註解 /** * aop限流註解 */ @Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.R ...
  • 我的gRPC之旅。本節簡單介紹gRPC的四種通信模式。簡單通信模式、服務端流通信模式、客戶端流通信模式、雙向流通信模式。 ...
  • Nacos 英文全稱為 Dynamic Naming and Configuration Service,是一個由阿裡巴巴團隊使用 Java 語言開發的開源項目。 ...
  • 六大設計原則 單一職責原則 介面隔離原則 開閉原則 依賴倒置原則 里氏代換原則 迪米特法則 單一職責原則 我們分別看兩個案例,一個是遵守單一職責原則,另一個是違背。 違背的案例 class Computer { void calc() { System.out.println("計算數據"); // ...
  • 在我們日常的開發中,我們經常會遇到 NullPointerException。如何才能優雅的處理NPE?這裡告訴大家一個較為流行的方法 java.util.Optional 使用Optional來修飾對象,表示這個對象可能為null。在使用時,就要加以註意,必須要考慮該值為null的場景。 使用Op ...
  • 我的JSP&Servlet之旅。本節複習鞏固HTTP基礎知識,涉及URI編碼,Servlet &JSP的運作方式,Web開發模式架構。 ...
一周排行
    -Advertisement-
    Play Games
  • 經常看到有群友調侃“為什麼搞Java的總在學習JVM調優?那是因為Java爛!我們.NET就不需要搞這些!”真的是這樣嗎?今天我就用一個案例來分析一下。 昨天,一位學生問了我一個問題:他建了一個預設的ASP.NET Core Web API的項目,也就是那個WeatherForecast的預設項目模 ...
  • 很多軟體工程師都認為MD5是一種加密演算法,然而這種觀點是不對的。作為一個 1992 年第一次被公開的演算法,到今天為止已經被髮現了一些致命的漏洞。本文討論MD5在密碼保存方面的一些問題。 ...
  • Maven可以使我們在構建項目時需要用到很多第三方類jar包,如下一些常用jar包 而maven的出現可以讓我們避免手動導入jar包出現的某些問題,它可以自動下載那須所需要的jar包 我們只需要在創建的maven項目自動生成的pom.xml中輸入如下代碼 <dependencies> <!--ser ...
  • 來源:https://developer.aliyun.com/article/694020 非同步調用幾乎是處理高併發Web應用性能問題的萬金油,那麼什麼是“非同步調用”? “非同步調用”對應的是“同步調用”,同步調用指程式按照定義順序依次執行,每一行程式都必須等待上一行程式執行完成之後才能執行;非同步調 ...
  • 1.面向對象 面向對象編程是在面向過程編程的基礎上發展來的,它比面向過程編程具有更強的靈活性和擴展性,所以可以先瞭解下什麼是面向過程編程: 面向過程編程的核心是過程,就是分析出實現需求所需要的步驟,通過函數一步一步實現這些步驟,接著依次調用即可,再簡單理解就是程式 從上到下一步步執行,從頭到尾的解決 ...
  • 10瓶毒藥其中只有一瓶有毒至少需要幾隻老鼠可以找到有毒的那瓶 身似浮雲,心如飛絮,氣若游絲。 用二分查找和二進位位運算的思想都可以把死亡的老鼠降到最低。 其中,二進位位運算就是每一隻老鼠代表一個二進位0或1,0就代表老鼠存活,1代表老鼠死亡;根據數學運算 23 = 8、24 = 16,那麼至少需要四 ...
  • 一、Kafka存在哪些方面的優勢 1. 多生產者 可以無縫地支持多個生產者,不管客戶端在使用單個主題還是多個主題。 2. 多消費者 支持多個消費者從一個單獨的消息流上讀取數據,而且消費者之間互不影響。 3. 基於磁碟的數據存儲 支持消費者非實時地讀取消息,由於消息被提交到磁碟,根據設置的規則進行保存 ...
  • 大家好,我是陶朱公Boy。 前言 上一篇文章《關於狀態機的技術選型,最後一個真心好》我跟大家聊了一下關於”狀態機“的話題。從眾多技術選型中我也推薦了一款阿裡開源的狀態機—“cola-statemachine”。 於是就有小伙伴私信我,自己項目也考慮引入這款狀態機,但網上資料實在太少,能不能系統的介紹 ...
  • 使用腳本自動跑實驗(Ubuntu),將實驗結果記錄在文件中,併在實驗結束之後將結果通過郵件發送到郵箱,最後在windows端自動解析成excel表格。 ...
  • 話說在前面,我不是小黑子~ 我是超級大黑子😏 表弟大周末的跑來我家,沒事幹天天騷擾我,搞得我都不能跟小姐姐好好聊天了,於是為了打發表弟,我決定用Python做一個小游戲來消耗一下他的精力,我思來想去,決定把他變成小黑子,於是做了一個坤坤打籃球的游戲,沒想到他還挺愛玩的~ 終於解放了,於是我把游戲寫 ...