首页 > 解决方案 > 传入装饰函数的参数

问题描述

一个什么都不做的简单装饰器可以像下面这样完成:

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)

标签: python

解决方案


def decorator(func):

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

    return func # don't need to call!

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

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

我们正在做的_func是创建一个将由装饰器返回的函数,并根据传入的定义其行为funcfunc所以当装饰器被调用时我们不会调用;但我们确实在 的主体内调用它_func,因为这就是我们在func执行_func执行的方式。

为什么这两种方法不同?

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

如何调用_func“绑定它”

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


推荐阅读