有没有办法向 python 中的内置函数添加额外的属性?

Is there a way to add extra attributes to a built-in function in python?

假设我有一个函数并想为其添加额外的属性,例如打印语句的 'last inputted' 属性。 此功能将能够接管所有现有功能和一些额外功能。

我的想法是制作一个函数,它具有与 print 语句完全相同的功能,但也能够记住最后输出的内容。

这是我做的..

last_mes = ""
def pprint(message, **kwargs):
    global last_mes
    print(message, **kwargs)
    last_mes = message

我认为这不是最好的方法。 是否有最佳方法?

如果您的意思是要重载 built-in 打印函数以便它具有额外的参数,请查看 this.

没有完美的方法,但您至少可以通过将额外数据附加到函数本身来避免污染全局命名空间:

def pprint(message, **kwargs):
    print(message, **kwargs)
    pprint.last_mes = message
pprint.last_mes = ""

其他解决方案包括单例可调用 class 实例:

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 变得不切实际,因此对于这种特定情况(几乎可以肯定这样做是设计目标)它不会起作用。

我要给出的最后一个选项是最 hackiest 的一个(它共享闭包的弱点,并增加了一个,但写起来很简单);将其隐藏在可变默认参数中:

def pprint(message, *, _last_mes_store=[""], **kwargs):
    print(message, **kwargs)
    _last_mes_store[0] = message

增加的额外问题是,如果调用者实际上通过关键字传递 _last_mes_store,您不会更新您打算更新的“函数静态”默认参数。