簡體   English   中英

區分只讀 function 輸入參數和可變輸入參數的 Pythonic 方法

[英]Pythonic way to distinguish read-only function input parameters from mutable ones

Python 似乎沒有有效的const限定符如何在 Python 中創建常量? 區分只讀/可變 function 參數的最“pythonic”方式是什么? 我應該在評論中指出嗎?

# my_graph is READ-ONLY
# my_set is added items with property X ...
def my_lovely_function(my_graph,my_set):

在 C 和其他幾種語言中,通常實際輸出是通過通過指針或引用傳遞的輸入進行通信的。 這樣做的原因是許多這些范例中的返回值機制已被劫持用於錯誤處理目的,即返回值是成功/錯誤代碼,而有用的輸出填充在輸入/指針引用中。 這導致需要將某些輸入表示為不可觸摸(常量),而將其他輸入表示為可觸摸,以防止在使用 function 時出現混淆。

Python 通常不希望你那樣做。 它希望您使用異常和異常處理來處理錯誤,並使用 return 語句來處理實際輸出。 這更清晰,更符合返回值在被錯誤處理劫持之前的原始想法。

在某些情況下,使用可變輸入將數據傳出更為方便。 python 中的所有內容始終通過引用。 這很好,除非調用上下文不希望您 function 修改它作為輸入提供的變量。

Python 的解決方案是 1) 期望 function 編寫器正確記錄輸入、輸出和對可變輸入的副作用,以及 2) 為調用上下文提供傳遞不可變對象的選項,如果他們想確保這些對象不會被更改.

因此,如果您有一個列表並且您不想調用 function 來從中添加或減去內容,請將信息作為元組傳遞。 沒有 function 將能夠向您的元組添加或減去任何內容,但是如果這些元素是可變的,他們可能能夠更改元組的元素。 傳遞一個 frozenset 而不是一個集合。 沒有不可變的 dict 類型,但您可以通過傳遞副本或將其轉換為凍結的元組集來解決這個問題。 字符串、整數、浮點數和復數都是不可變的。 請注意,嵌入在不可變容器中的可變對象仍然可以更改。 如果這是不需要的,那么請確保它們是不可變的。 或者,如果您偏執,您可以在 object 上調用 copy.deepcopy() 以制作完全獨立的副本(遞歸)以傳遞到 function。此深層副本的任何嵌套級別的任何更改都不會影響原始 object。

在編寫 function 時,應該從文檔(最好是文檔字符串)或代碼本身清楚可變對象的返回值和副作用是什么。 在編寫 function 時使用文檔字符串來捕獲此內容是最佳實踐。

撥打 function 時,您應該根據具體情況使用不可變類型(或在需要時使用深度復制)作為防御措施。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM