参数传入修饰函数

时间:2019-10-28 00:48:09

标签: python

不执行任何操作的简单装饰器,如下所示:

def decorator(func):
    return func # don't need to call!

@decorator
def print_word(word='python'):
    print (word)

那会很好的运行

>>> print_word()
python

但是,如果我将其包装在一个内部函数中,它会像这样被调用:

def decorator(func):
    def _func(*args, **kwargs):
        print ("Args: %s | Kwargs: %s" % (args, kwargs))
        return func(*args, **kwargs) # <== Here I need to "call" it with ()
    return _func

@decorator
def print_word(word='python'):
    print (word)

>>> print_word('ok')
Args: ('ok',) | Kwargs: {}
ok

为什么这两种方法有什么不同?如何调用_func“绑定”到_func(*args, **kwargs)

1 个答案:

答案 0 :(得分:0)

def decorator(func):

因为它是一个装饰器,所以我们希望它返回可以被调用的东西。

    return func # don't need to call!

是的,因为func是我们将返回的“可以调用的东西”。装饰器无效。

  

然后,如果我将其包装在一个内部函数中,它被称为like

我们对_func所做的工作是创建装饰器将返回的 new 函数,并根据传递的 定义其行为。在func中。因此,在调用装饰器时,我们不会调用func;但我们确实将其称为_func的正文,因为这是使func执行时_func执行的方式。。

  

为什么这两种方法不同?

我不明白这个问题。它们有什么相同之处?他们俩都定义了一个装饰器,好的。他们以完全不同的方式来做。

  

如何调用_func“绑定”

我不明白您对此处进行绑定的意思,并且在此代码中没有直接按名称调用_func。调用print_word时会调用它,因为装饰器已将print_word替换为本地创建的_func。 (每次使用装饰器时,都会创建一个具有相同_func名称的单独函数。这就是您绊脚石吗?)