下面的代码假设记录函数名称,位置参数的数量和关键字参数
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'
我已经阅读了我正在学习的教科书的前几页,并且我遵循了所有的语法......我似乎在想。
答案 0 :(得分:0)
您将函数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
答案 1 :(得分:0)
好的,我已编辑了一些代码来修复缩进问题以及传递给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保留为类名。