使用装饰器和直接应​​用函数有什么区别吗?

Is there any difference between using a decorator and applying the function directly?

我最近成为了 PyPDF2 的维护者——一个相当古老的库,仍然有一些代码处理 Python 2.4 之前的 版本。虽然我想尽快放弃对 3.5 及更早版本的支持,但我发现有些部分我不确定为什么要按原样编写。

一个例子是这样的:

代码中的内容:

class Foo(object):
    def a(b, c):
        print(b)
        print(c)

    a = staticmethod(a)

我期望的是:

class Bar(object):
    @staticmethod
    def a(b, c):
        print(b)
        print(c)

有没有理由使用第一种表示法?它们是否严格等价?

我看过 decorators were introduced in Python 2.4,所以这可能是这种极端遗留代码的一个例子。

第一个版本只是 pre-2.4 的使用方式staticmethod。这两个版本并不完全等价,但差别很小,几乎无关紧要。

具体来说,在支持装饰器语法的Python版本上,一个区别是第二个版本将原始函数直接传递给staticmethod,而第一个版本将原始函数存储到a 然后查找 a 变量以找到要传递给 staticmethod 的参数。从技术上讲,这在非常奇怪的用例中可能很重要,尤其是对于元类,但这不太可能。 Python 2 甚至不支持相关的元类功能 (__prepare__)。