發表文章

目前顯示的是有「python」標籤的文章

python3 限定使用 keyword 關鍵字的方式作為參數

這篇是從 《Effective Python》: tips 21 學習到的觀念 在我們實作 function 的時候,定義 function specification。為了讓 function 的行為能夠更明確化,我們傾向在傳遞某些參數的時候 "強制" "限定" 使用 keyword方式的寫法來傳遞參數也就是指名 parameter=value 的方式。 這在 Python 裡面稱為 "Keyword-only Arguments" 相較於 Python2, Python3 有特殊的語法來支持這樣的使用方式: 在 parameter list 可以看到 "*" 它是用來標記 positional arguments 的結尾。在這之後的參數都一定要使用 keyword-only 的寫法。 如果這時候,我們使用 3個以上的 positional arguments 的話,會引發 "TypeError" 那 Python2 呢?使用 **kwargs 的方式,並且要手動引發 TypeError 。

python 動態預設參數, 執行期

python 動態預設參數, 執行期 本文的內容是參考 《Effective Python》: tips 20 我們在 python 定義一個 function 時,如果想要給定 default argument 可以這樣寫: def foo (arg= 10 ) : ... processing arg ... 但是如果我們今天要使用的預設參數是在動執行期才能夠決定的,而不是靜態時期該怎麼做呢? 例如:我們想要寫一個 log function, 會印出當時訊息的時間, 跟訊息內容 def log (msg, when=datetime.now () ) : print( "{when}: {msg}" .format(when, msg)) 可是如果我們是用上面的寫法,會發現取到的時間都是一樣的,那是 function 被定義的時間。為了處裡這個問題,我們會先將它設置為 None 再做進一步的處理,然後再利用 docstring 來補充說明 default argument 的用處。 def log (msg, when=None) : """ when 的預設值是 function call 發生的時間,也就是 log message 的時間 """ when = datetime.now() if when is None else when ... print message ... 因為 default argument 只會被 evaluate 計算一次,所以如果我們使用 [], {} 做為我們的 default argument 有時候會出現不可預期的錯誤。 例如: def to_json (data, default={}) : try : return json.loads(data) except ValueError: return default json_data1 = to_json( '123 321' ) json_data1[ 'k1' ] ...