使用装饰器和直接应用函数有什么区别吗?
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__
)。
我最近成为了 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__
)。