假設我有一個函式并想向它添加額外的屬性,例如列印陳述句的“最后輸入”屬性。此功能將能夠接管所有現有功能和一些額外功能。
我的想法是創建一個函式,它具有與列印陳述句完全相同的功能,但也能夠記住最后輸出的內容。
我做的..
last_mes = ""
def pprint(message, **kwargs):
global last_mes
print(message, **kwargs)
last_mes = message
我不認為這是最好的方法。有沒有最佳的方法呢?
uj5u.com熱心網友回復:
沒有完美的方法,但您至少可以通過將額外資料附加到函式本身來避免污染全域命名空間:
def pprint(message, **kwargs):
print(message, **kwargs)
pprint.last_mes = message
pprint.last_mes = ""
其他解決方案包括一個單例可呼叫類實體:
class _StatefulPprint:
def __init__(self):
self.last_mes = ""
def __call__(self, message, **kwargs):
print(message, **kwargs)
self.last_mes = message
pprint = _StatefulPprint()
# Optionally remove class to remove definition from view:
del _StatefulPprint
或使用封口機:
def make_pprint():
last_mes = ""
def pprint(message, **kwargs):
nonlocal last_mes
print(message, **kwargs)
last_mes = message
return pprint
pprint = make_pprint()
del make_pprint # Optional
但是,閉包使您無法訪問last_mes外部pprint,因此對于這種特定情況(這樣做幾乎可以肯定是設計目標),它將不起作用。
我要給出的最后一個選項是最駭人聽聞的選項(它共享閉包的弱點,并添加了一個,但撰寫起來很簡單);將其隱藏在可變的默認引數中:
def pprint(message, *, _last_mes_store=[""], **kwargs):
print(message, **kwargs)
_last_mes_store[0] = message
添加的額外問題是,如果呼叫者實際上通過_last_mes_store關鍵字傳遞,您不會更新您想要的“函式靜態”默認引數。
uj5u.com熱心網友回復:
如果你的意思是你想多載內置的 print 函式,讓它有額外的引數,看看這個。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/481938.html
