」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > MyPy簡介

MyPy簡介

發佈於2024-08-26
瀏覽:602

MyPy Introduction

介紹

MyPy1 是 Python 的靜態型別檢查器。與 C 或 Java 等靜態類型語言不同,Python 是動態類型的。這意味著在 Python 中,您不必明確聲明變數的類型;它是在運行時推斷的。例如:

Python(動態型別)

num = 4                # `num` is inferred as an integer
newString = "new string"  # `newString` is inferred as a string

相反,靜態類型語言要求您在編譯時指定每個變數的類型。這有助於在開發期間而不是在運行時捕獲與類型相關的錯誤。

C(靜態型別)

int num = 4;            // `num` is declared as an integer
std::string newString = "new string";  // `newString` is declared as a string

為什麼要使用 MyPy?

在Python等動態類型語言中,運行時可能會發生類型錯誤,這可能會導致更難以追蹤的錯誤。 MyPy 透過允許您在 Python 程式碼中新增類型提示來解決這個問題,這些提示可以在執行前進行靜態檢查。這提供了幾個優點:

  • 早期錯誤檢測:在開發過程中識別與類型相關的錯誤,而不是在運行時遇到它們。
  • 提高程式碼可讀性:類型提示闡明變數和函數參數的預期類型,增強程式碼可讀性。
  • 更好的 IDE 支援:在支援類型提示的 IDE 中提供改進的程式碼完成和內聯文件。

MyPy 的範例

這是一個簡單的範例,示範了 MyPy 中類型提示的使用:

沒有類型提示

def add(a, b):
    return a   b

print(add(5, 3))      # Output: 8
print(add("hello", "world"))  # Output: helloworld

在上面的程式碼中,add 函數可以接受整數和字串,這可能不是預期的行為。

帶類型提示

def add(a: int, b: int) -> int:
    return a   b

print(add(5, 3))      # Output: 8
# mypy will report an error for the following line:
# print(add("hello", "world"))  # TypeError: Expected int, got str

透過包含類型提示(a: int、b: int),您可以指定 add 只適用於整數。 MyPy 根據這些類型提示檢查程式碼,儘早發現潛在的類型相關問題。

安裝並運行 MyPy

開始使用 MyPy:

  1. 安裝:使用pip安裝MyPy:
   python3 -m pip install mypy
  1. 執行 MyPy:安裝後,您可以執行 MyPy 檢查程式碼是否有類型錯誤。使用以下命令:
   mypy program.py

此命令將靜態檢查您的程式碼,類似於編譯器檢查 C 中的語法的方式。它將報告它發現的任何類型錯誤,而無需實際運行程式碼。

有效地使用 MyPy 可讓您將靜態類型的優點整合到 Python 中,同時仍可享受其動態特性的靈活性。

讓我們用 MyPy 寫一個範例

沒有 MyPy

def greeting(name):
    return 'Hello '   name

# These calls will fail when the program runs, but MyPy will not report an error
greeting(123)
greeting(b"Aniket")

使用 MyPy

透過新增類型註釋(也稱為類型提示),MyPy 可以檢測潛在問題:

def greeting(name: str) -> str:
    return 'Hello '   name

greeting(3)         # mypy will report: Argument 1 to "greeting" has incompatible type "int"; expected "str"
greeting(b'Alice')  # mypy will report: Argument 1 to "greeting" has incompatible type "bytes"; expected "str"
greeting("World!")  # No error

這裡:

  • name: str 註解指定 name 參數應該是字串。
  • -> str註解指定函數greeting將傳回一個字串。

何時使用 MyPy

MyPy 在多種情況下很有用:

  • 儘早捕獲錯誤:在運行程式碼之前使用 MyPy 尋找與類型相關的錯誤。這有助於及早發現錯誤並提高程式碼可靠性。

  • 使程式碼更清晰:添加類型提示使您的程式碼更易於理解。它顯示了期望的值類型,這有助於其他人(以及未來的你)更好地理解你的程式碼。

  • 升級舊程式碼:更新舊程式碼時,MyPy 在新增類型提示時協助尋找型別問題,讓過渡更加平滑。

  • 改進原型:建立新功能或原型時,MyPy 透過強制執行類型規則來幫助確保新程式碼與現有程式碼正確配合。

  • 維護大型專案:在有許多貢獻者的大型專案中,MyPy 有助於保持程式碼一致性並防止與類型相關的錯誤。

  • Boost IDE 功能:如果您使用 IDE,MyPy 改進了程式碼完成和導航等功能,讓開發更容易。

使用 MyPy 可以幫助您編寫更好、更可靠的 Python 程式碼,同時仍然享受 Python 的靈活性。

mypy 的官方快速備忘單


  1. 官方文件↩

版本聲明 本文轉載於:https://dev.to/aniket_purohit/mypy-introduction-1i3?1如有侵犯,請洽[email protected]刪除
最新教學 更多>
  • 在細胞編輯後,如何維護自定義的JTable細胞渲染?
    在細胞編輯後,如何維護自定義的JTable細胞渲染?
    在JTable中維護jtable單元格渲染後,在JTable中,在JTable中實現自定義單元格渲染和編輯功能可以增強用戶體驗。但是,至關重要的是要確保即使在編輯操作後也保留所需的格式。 在設置用於格式化“價格”列的“價格”列,用戶遇到的數字格式丟失的“價格”列的“價格”之後,問題在設置自定義單元...
    程式設計 發佈於2025-06-25
  • MySQL中如何高效地根據兩個條件INSERT或UPDATE行?
    MySQL中如何高效地根據兩個條件INSERT或UPDATE行?
    在兩個條件下插入或更新或更新 solution:的答案在於mysql的插入中...在重複鍵更新語法上。如果不存在匹配行或更新現有行,則此功能強大的功能可以通過插入新行來進行有效的數據操作。如果違反了唯一的密鑰約束。 實現所需的行為,該表必須具有唯一的鍵定義(在這種情況下為'名稱'...
    程式設計 發佈於2025-06-25
  • CSS可以根據任何屬性值來定位HTML元素嗎?
    CSS可以根據任何屬性值來定位HTML元素嗎?
    靶向html元素,在CSS 中使用任何屬性值,在CSS中,可以基於特定屬性(如下所示)基於特定屬性的基於特定屬性的emants目標元素: 字體家庭:康斯拉斯(Consolas); } 但是,出現一個常見的問題:元素可以根據任何屬性值而定位嗎?本文探討了此主題。 的目標元素有任何任何屬性值,...
    程式設計 發佈於2025-06-25
  • 為什麼HTML無法打印頁碼及解決方案
    為什麼HTML無法打印頁碼及解決方案
    無法在html頁面上打印頁碼? @page規則在@Media內部和外部都無濟於事。 HTML:Customization:@page { margin: 10%; @top-center { font-family: sans-serif; font-weight: ...
    程式設計 發佈於2025-06-25
  • Python讀取CSV文件UnicodeDecodeError終極解決方法
    Python讀取CSV文件UnicodeDecodeError終極解決方法
    在試圖使用已內置的CSV模塊讀取Python中時,CSV文件中的Unicode Decode Decode Decode Decode decode Error讀取,您可能會遇到錯誤的錯誤:無法解碼字節 在位置2-3中:截斷\ uxxxxxxxx逃脫當CSV文件包含特殊字符或Unicode的路徑逃...
    程式設計 發佈於2025-06-25
  • 如何為PostgreSQL中的每個唯一標識符有效地檢索最後一行?
    如何為PostgreSQL中的每個唯一標識符有效地檢索最後一行?
    postgresql:為每個唯一標識符提取最後一行,在Postgresql中,您可能需要遇到與在數據庫中的每個不同標識相關的信息中提取信息的情況。考慮以下數據:[ 1 2014-02-01 kjkj 在數據集中的每個唯一ID中檢索最後一行的信息,您可以在操作員上使用Postgres的有效效率: ...
    程式設計 發佈於2025-06-25
  • JavaScript計算兩個日期之間天數的方法
    JavaScript計算兩個日期之間天數的方法
    How to Calculate the Difference Between Dates in JavascriptAs you attempt to determine the difference between two dates in Javascript, consider this s...
    程式設計 發佈於2025-06-25
  • 表單刷新後如何防止重複提交?
    表單刷新後如何防止重複提交?
    在Web開發中預防重複提交 在表格提交後刷新頁面時,遇到重複提交的問題是常見的。要解決這個問題,請考慮以下方法: 想像一下具有這樣的代碼段,看起來像這樣的代碼段:)){ //數據庫操作... 迴聲“操作完成”; 死(); } ? > ...
    程式設計 發佈於2025-06-25
  • 解決Spring Security 4.1及以上版本CORS問題指南
    解決Spring Security 4.1及以上版本CORS問題指南
    彈簧安全性cors filter:故障排除常見問題 在將Spring Security集成到現有項目中時,您可能會遇到與CORS相關的錯誤,如果像“訪問Control-allo-allow-Origin”之類的標頭,則無法設置在響應中。為了解決此問題,您可以實現自定義過濾器,例如代碼段中的MyFi...
    程式設計 發佈於2025-06-25
  • 將圖片浮動到底部右側並環繞文字的技巧
    將圖片浮動到底部右側並環繞文字的技巧
    在Web設計中圍繞在Web設計中,有時可以將圖像浮動到頁面右下角,從而使文本圍繞它纏繞。這可以在有效地展示圖像的同時創建一個吸引人的視覺效果。 css位置在右下角,使用css float and clear properties: img { 浮點:對; ...
    程式設計 發佈於2025-06-25
  • 如何限制動態大小的父元素中元素的滾動範圍?
    如何限制動態大小的父元素中元素的滾動範圍?
    在交互式接口中實現垂直滾動元素的CSS高度限制問題:考慮一個佈局,其中我們具有與用戶垂直滾動一起移動的可滾動地圖div,同時與固定的固定sidebar保持一致。但是,地圖的滾動無限期擴展,超過了視口的高度,阻止用戶訪問頁面頁腳。 $("#map").css({ margin...
    程式設計 發佈於2025-06-25
  • 在C#中如何高效重複字符串字符用於縮進?
    在C#中如何高效重複字符串字符用於縮進?
    在基於項目的深度下固定字符串時,重複一個字符串以進行凹痕,很方便有效地有一種有效的方法來返回字符串重複指定的次數的字符串。使用指定的次數。 constructor 這將返回字符串“ -----”。 字符串凹痕= new String(' - ',depth); console.W...
    程式設計 發佈於2025-06-25
  • 如何干淨地刪除匿名JavaScript事件處理程序?
    如何干淨地刪除匿名JavaScript事件處理程序?
    刪除匿名事件偵聽器將匿名事件偵聽器添加到元素中會提供靈活性和簡單性,但是當要刪除它們時,可以構成挑戰,而無需替換元素本身就可以替換一個問題。 element? element.addeventlistener(event,function(){/在這里工作/},false); 要解決此問題,請考...
    程式設計 發佈於2025-06-25
  • 如何有效地選擇熊貓數據框中的列?
    如何有效地選擇熊貓數據框中的列?
    在處理數據操作任務時,在Pandas DataFrames 中選擇列時,選擇特定列的必要條件是必要的。在Pandas中,選擇列的各種選項。 選項1:使用列名 如果已知列索引,請使用ILOC函數選擇它們。請注意,python索引基於零。 df1 = df.iloc [:,0:2]#使用索引0和1 ...
    程式設計 發佈於2025-06-25
  • Spark DataFrame添加常量列的妙招
    Spark DataFrame添加常量列的妙招
    在Spark Dataframe ,將常數列添加到Spark DataFrame,該列具有適用於所有行的任意值的Spark DataFrame,可以通過多種方式實現。使用文字值(SPARK 1.3)在嘗試提供直接值時,用於此問題時,旨在為此目的的column方法可能會導致錯誤。 df.withCo...
    程式設計 發佈於2025-06-25

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3