Python 高階程式設計 Type Hint (一)

2021-10-08 03:42:03 字數 1434 閱讀 2396

近來使用python作為專案開發語言。

為符合軟體工程的要求,提高**質量和可讀性,考慮使用python一些高階特性,比如新版本引入的官方typing庫。程式設計師在使用typing庫並遵循一定規範進行編碼後,如果所使用的ide支援這種python的新規範,則能進行一些高階的靜態檢查,比如泛型的支援。

泛型(generic)指的是允許程式設計師在編寫**時定義一些可變部分,那些部分在使用前才作出指明,這是一種思想。以泛型類為例(這是泛型思想的乙個具體例項),考慮c++中的vector,這就是乙個泛型類。它在程式設計師編寫時(c++標準庫編寫時),沒有指明裡面元素的具體型別,直到我們這些外部人員呼叫這個vector類時,才指明元素的型別,比如vector。

型別變數(type variable),就是表徵型別的變數,它的取值可以是int型別物件,也可以是str型別物件(注意,型別物件不等同於型別取值)

應注意到,python語言是一門動態語言,以上的討論僅是靜態檢查。靜態檢查的意思可以理解為,ide以高階語言的層次對**進行語法分析,包括型別推斷,根據分析的內容給出**修改的建議。也就是說,建議並不是強制性的,只是輔助性的。

使用typing庫和一些python的高階特性並不會對程式執行時有任何影響,僅僅只是在編碼時,讓ide能給你提供更好的修改意見。

考慮以下乙個例子。

from typing import typevar, generic

t = typevar("t", int, float)

class go(generic[t]):

def __init__(self, value: t) -> none:

self.value = value

def test(self, value: t):

print(value)

jj = go("123")

#使用pycharm時,這裡會變橙、警告

#因為前面宣告了go類的建構函式的引數是個泛型

#泛型被約束為「int」或"float"

kk = go(0.123)

kk.test("123")

#使用pycharm時,這裡會下劃線、提示

#因為go物件在構造時,泛型被選為了float型別

#而使用test方法時,期望的型別是泛型(此時是float),實際卻是str

typevar的第乙個引數是這個型別變數的原名字,第二個及後面的引數是可選的,用來限制型別變數的取值。原名字的概念可以參考型別別名的概念,假設integer, int32 都是 int的別名,則int就是前兩者的原名字。

之所以,有時候要遵循這些規範,在python這種膠水語言中宣告型別,是因為在較大工程編碼時,一不小心或者乙個恍惚,就會有可能留下乙個很深的bug,這或許直到最後都未能測試出來,而在未來的某一天爆發。遵循規範,就有可能在最早時候發現。

有趣的是,python另乙個可能會造成bug的地方是深拷貝、淺拷貝的概念,這點在本文不深入闡述了。

python程式設計高階

1 開閉原則 遵循開發封閉原則,雖然在這個原則是用的物件導向開發,但是也適用於函式式程式設計,簡單來說,它規定已經實現的功能 不允許被修改,但可以被擴充套件,即 封閉 已實現的功能 塊 開放 對擴充套件開發 2 可使用裝飾器實現開閉原則 裝飾器是不對原函式內部 進行修改的前提下,在外部增加一些功能,...

python高階程式設計

包和模組的概念及is和 的區別1.包 包含多個python檔案 模組的資料夾,並且資料夾中有乙個名稱為init.py的特殊宣告檔案,那麼這個資料夾就是乙個包 模組包 可以將大量功能相關的python模組包含起來統一管理,同樣也可以被其他模組通過import關鍵字引入重複使用封裝的模組和 2.模組 p...

Python高階程式設計

list comprehension 1.列表推導 i for i in range 10 if i 2 0 0,2,4,6,8 i也可以是乙個函式,該風格比c語言思想的 風格效率高 2.enumerate 取到了序列中的序列號好內容 forindex,item inenumerate sequen...