繁体   English   中英

Python函数修饰器示例返回错误

[英]Python function decorator example returning errors

下面的代码假定记录函数名称,位置参数和关键字参数的数量

def log(original_function):
def new_function(*args, **kwargs):
    with open("log.txt", "w") as logfile:
        logfile.write("%s,%s,%s" % (log, len(args),len(kwargs.keys())))

    return original_function(*args, **kwargs)

return new_function


def my_function(message):
    print(message) 

>>> my_function = log(my_function)
>>> A = (2,3,4,5)
>>> B = {'Anthony' : 6, 'James' : 7}
>>> my_function(*A, **B)

我收到此错误:

 return original_function(*args, **kwargs)
TypeError: my_function() got an unexpected keyword argument 'Anthony'

我浏览了我正在学习的教科书的前几页,并且遵循了所有语法……我似乎认为。

您将以下参数作为函数my_function(message)的参数:

my_function(2, 3, 4, 5, Anthony=6, James=7)

您的装饰器看起来像这样

def decorator(func):
    def wrapper(*args, **kwargs):
        # Some code
        return func(*args, **kwargs)
    return wrapper

然后装饰功能:

new_func = decorator(my_function)

所以new_funcmy_function的包装。 但是您正在这样调用函数:

A = (2, 3, 4, 5)
B = {'Anthony' : 6, 'James' : 7}
new_func(*A, **B)

相当于

new_func(2, 3, 4, 5, Anthony=6, James=7)

堆栈看起来像这样:

new_func(2, 3, 4, 5, Anthony=6, James=7)
 > wrapper(2, 3, 4, 5, Anthony=6, James=7)
    > my_function(2, 3, 4, 5, Anthony=6, James=7)

而且my_function只允许一个参数: message

好的,我已经稍微修改了您的代码以解决缩进问题以及传递给my_function的参数数量(6个而不是1个)

def log(original_function):
    def new_function(*args, **kwargs):
        with open("log.txt", "w") as logfile:
            logfile.write("%s,%s,%s" % (log, len(args),len(kwargs)))

        return original_function(*args, **kwargs)

    return new_function

def my_function(message):
    print(message)

my_function = log(my_function)
#A = (2,3,4,5)
#B = {'Anthony' : 6, 'James' : 7}
#my_function(*A, **B)
my_function("hello there")

产生

hello there

cat log.txt

产生

<function log at 0x7faf64be85f0>,1,0

如果将my_function定义为

def my_function(a, b, c, d, Anthony, James):
    print(a, b, c, d, Anthony, James)

然后

my_function = log(my_function)
A = (2,3,4,5)
B = {'Anthony' : 6, 'James' : 7}
my_function(*A, **B)

会产生:

(2, 3, 4, 5, 6, 7) # in python 2.7; 2, 3, 4, 5, 6, 7 in python3

注意事项:避免使用CamelCase调用变量,而应使用小写字母。 将CamelCase保留为类名。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM