一、NotSpecified簡介
NotSpecified是Python3.10版本引入的一個新參數值。這個參數值定義在types模塊中,可以作為函數、方法或者類的參數默認值。它的作用是告訴Python解釋器,這個參數的設定不重要,可以在需要的時候再設定。同時,該參數的存在也能夠提高函數參數的可讀性和可維護性。
二、NotSpecified的應用場景
1、過時參數的替代
有時候,某個函數中的參數被廢棄了,不再推薦使用,但為了保持兼容性,還需要保留該參數的介面。此時,可以使用NotSpecified作為該參數的默認值,表示該參數可以不被設置或者其它參數值可以被傳遞進去,從而保證了代碼的兼容性。
def foo(a, b, c=NotSpecified): if c is NotSpecified: warnings.warn("the parameter 'c' is deprecated and will be removed in future releases", DeprecationWarning) # 不採用默認值NotSpecified,程序會報錯 # ...
2、高可讀性與可維護性
使用NotSpecified作為默認值,能夠使代碼更加易讀,因為它說明了該參數是一個可選參數,可以不設置。同時,由於其定義作用,該參數也能夠更好地與函數的其它部分解耦合。
def foo(a, b, c=NotSpecified): # 避免在函數體直接使用默認值NotSpecified if c is NotSpecified: # ...
三、NotSpecified的局限
作為一種參數默認值類型,NotSpecified也有其局限性。例如,如果使用NotSpecified作為參數的默認值,會影響函數參數的注釋以及IDE的自動補全等功能。此外,在默認值為NotSpecified的情況下,如果該參數的類型需要是必須設置的,那麼可以使用傳統的默認值(例如「None」)。
四、NotSpecified的底層實現
NotSpecified的實現非常簡單,它只是一個空的 sentinel 實例。它定義在types模塊中,可以通過types.NotSpecified進行使用。此外,該模塊還開放了sentinel、_GeneratorWrapper、CoroutineWrapper三個特殊的 sentinel 對象,這些對象都是類似於布爾值的單例對象,用於標識沒有數據的情況,增強了Python的可讀性和可維護性。
import types def foo(a, b, c=types.NotSpecified): if c is types.NotSpecified: print("The parameter 'c' is not set.") foo(1, 2) # 輸出:The parameter 'c' is not set. foo(1, 2, 3) # 沒有輸出
五、NotSpecified使用的注意事項
在使用NotSpecified的時候需要注意,因為NotSpecified定義的參數值不等同於一般默認值的None。所以如果沒有特別需要,建議在函數體內進行判斷,以便更好地避免BUG。
六、總結
在Python3.10版本中引入的NotSpecified參數默認值,可以方便地解決函數中舊參數的替換以及提高代碼的可讀性和可維護性。但是它需要更多的注意力來避免因參數採用默認NotSpecified引起的問題。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/185740.html