Python装饰器中的命名约定

36

Python装饰器内部是否存在任何“被接受的”命名约定?

风格指南没有提到它,这篇关于装饰器的精彩文章在使用变量名称时相当一致,通常会使用“wrapped”的变形作为返回的最终函数名称,但是在创建需要参数的装饰器时,使用的变量名称如何呢?

def decorator_name(whatevs):
    def inner(function):
        def wrapped(*args, **kwargs):
            # sweet decorator goodness
        return wrapped
    return inner

具体来说,上述示例中的 innerfunctionwrapped 的约定是什么?

2个回答

28

针对这些函数名称,没有像PEP这样的标准惯例。如果您查看Python标准库,您会发现很多不同名称的这些函数。

然而,decorator是一个相当常见的用于修饰器函数inner的名称。
使用wrapper作为您的包装函数名称也很常见,并将其与functools.wraps(f)一起使用,其中f为被包装的函数(func也是它的常见名称)。

def decorator_name(whatevs):
    def decorator(f):
        @wraps(f)
        def wrapper(*args, **kwargs):
            pass # sweet decorator goodness
        return wrapper
    return decorator

5
如果你有一个名为 decorator 的单参数函数,那么无论它的参数被称为什么,都很清楚该参数是什么。 - Ben
1
调用内部函数decorator可能是一个非常好的主意,因为decorator_name并不是真正的装饰器,而是一个装饰器工厂,多层嵌套的函数定义可能会有点令人困惑。 - Ben
1
为什么要缩写 function? 我也在 这里 问过。 - mstringer
3
我发现自己经常使用 f 或 _f 或 g,因为它们符合数学符号(如“ f(x)”)并强调传递的函数本身并不需要受限制。这与关键函数或比较函数、只接受一个参数的函数等不同。 - Jeff Tratner
1
@David 鉴于装饰器接受参数,这意味着在@foo(...)中,foo函数实际上需要返回应用于函数的装饰器 (foo 在导入时被调用,然后 foo 的返回值修饰您的函数)。 - ThiefMaster
显示剩余2条评论

2

根据定义,在Python中,装饰器可以是函数或类,因此实现的类型(类或函数)是决定使用哪种命名约定的因素。 一个常见的错误是用关键字decorator作为函数名称前缀。 有关装饰器的更多信息,请参见链接


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接