假设我有一个函数,并希望为其添加额外的属性,例如为打印语句添加'最后输入'属性。此功能将能够接管所有现有功能&一些额外的功能
我的想法是创建一个函数,它将具有与print语句完全相同的功能,但也能够记住最后输出的内容。
I made this.
last_mes = ""
def pprint(message, **kwargs):
global last_mes
print(message, **kwargs)
last_mes = message
但我不认为这是最好的方法。有没有最佳的方法?没有完美的方法,但至少可以通过将额外的数据附加到函数本身来避免污染全局命名空间:
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
闭包使您无法在pprint
之外访问last_mes
,所以对于这个特定的情况(这样做几乎肯定是一个设计目标),它将不起作用。
我要给出的最后一个选项是最令人讨厌的一个(它分享了闭包的弱点,并增加了一个,但编写起来很简单);将它隐藏在一个可变的默认参数中:
def pprint(message, *, _last_mes_store=[""], **kwargs):
print(message, **kwargs)
_last_mes_store[0] = message
增加的额外问题是,如果调用者实际上通过关键字传递_last_mes_store
,则不需要静态更新函数。
如果你想重载内置的打印函数,让它有额外的参数,看看这个