【问题标题】:What does it mean to decorate with an argument in Python?在 Python 中用参数装饰是什么意思?
【发布时间】:2017-10-04 09:35:59
【问题描述】:

在 Python 中,我对装饰器有所了解。 在我的拙劣理解中,装饰函数声明返回装饰器函数使用原始函数构造的任何内容(最合理地,这应该是可调用的):

def deco(func):
    def func_wrapper(name):
        return func(name)+", how are you?"
    return func_wrapper

@deco
def foo(name):
    return "Hello "+name

print(foo("Michael"))

这给出了:

Hello Michael, how are you?

但是如果一个装饰器与一个参数一起被指定:

def deco2(info):
    def info_decorator(func):
        def func_wrapper(name):
            return func(name) + info
        return func_wrapper
    return info_decorator

@deco2(", how are you?")
def foo2(name):
    return "Hello "+name

print(foo2("Regina"))

给予

Hello Regina, how are you?

处理这个装饰器的“规则”是什么? 似乎,不是返回foo2,Python 首先使用给定的 arg 调用 deco2,并且假设,此调用首先构造装饰器的工厂,然后像以前一样将 foo2 传递给它以返回最终的包装器。但是,在这种情况下,涉及到一个额外的“”(三个定义而不是两个),这让我很难确定一般规则。

【问题讨论】:

  • 你的第二个装饰器相当于:foo2 = deco2(", how are you?")(foo2) 放在foo2 之后。
  • 我知道,但在第一种情况下,它只是:foo = deco(foo) 放在 foo 之后。是装饰器中 Python 知道要添加额外间接的参数吗?

标签: python python-decorators


【解决方案1】:

如果你应用装饰器 没有 参数,例如@foo,然后装饰器将被装饰的函数作为其参数,并期望返回任何将替换装饰函数的可调用对象。

如果你应用装饰器 with 参数,例如@foo('bar'),那么装饰器应该返回一个可调用的,它将以装饰函数作为其参数,并返回和可调用的将替换装饰函数。

换句话说:没有参数的装饰器只需要被装饰的函数,但有参数的装饰器需要自己的参数并且它需要以某种方式获取被装饰的函数。由于装饰器的参数是任意的并且不受任何限制,因此很难提出任何非限制性规则来说明如何将被装饰者也传递给它。在这种情况下,应用了两步过程:获取装饰器参数,然后返回另一个接受装饰器的可调用对象。

【讨论】:

    猜你喜欢
    • 2015-09-21
    • 2013-01-12
    • 2010-09-27
    • 1970-01-01
    • 2016-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-09
    相关资源
    最近更新 更多