[英]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_func
是my_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.