Python functools.partial - 如何使用静态装饰器将其应用于类方法

Gre*_*reg 7 python static-methods functools python-decorators

我知道一定有办法做到这一点。但我收到错误“TypeError:第一个参数必须可调用”。

我可以采取哪些不同的措施来完成这项工作?

class FaxMachine(object):
    MODEL_NO = '100'

    @staticmethod
    def load_fax(fax, error=''):
        # send fax here

    fail_fax = functools.partial(load_fax, error='PC LOAD LETTER')
Run Code Online (Sandbox Code Playgroud)

vau*_*tah 8

staticmethod对象不可调用。它们是在其属性中保留对原始函数的引用的描述符__func__

所以以下工作:

# Note: apply staticmethod again
fail_fax = staticmethod(partial(load_fax.__func__, error='PC LOAD LETTER'))
Run Code Online (Sandbox Code Playgroud)

您还可以在类命名空间中定义一个辅助函数,以避免不必要的属性查找:

def _load_fax(fax, error=''):
    # ...

# _load_fax is an ordinary function
load_fax = staticmethod(_load_fax)
fail_fax = staticmethod(partial(_load_fax, error='PC LOAD LETTER'))
Run Code Online (Sandbox Code Playgroud)

尽管正确的 Python 3.4+ 解决方案是使用partialmethod,它旨在与描述符一起使用:

fail_fax = partialmethod(load_fax, error='PC LOAD LETTER')
Run Code Online (Sandbox Code Playgroud)