函数,将list作为与decorator一起使用的参数



我正在创建一个程序;待办事项列表";。我准备了一个函数,它编写用户输入的项目列表。然后,使用decorator,我希望列表中的每一项都添加到txt文件中。我很难把列表中的项目一个接一个地写到文件中。在包装器函数中使用for循环不起作用——运行后,日志上不会显示任何内容

def decorator(func):
def wrapper(*args):
with open("to_do_list.txt", "a") as l:
for i in range(len(args)):
l.write(f"{func(*args[i])} n")
return wrapper
@decorator
def to_do():
print("TO DO LIST")
status = True
list = []
while status:
x = input("Add a task to a list: ")
list.append(x)
q = input("Do you wanna continue typing (Y), or quit (Q)?").lower()
if q == "n":
status = False
return list
to_do()

如果您想修复生成器:

def decorator(func):
def wrapper(*args, **kwargs):  #  use args and kwargs
res = func(*args, **kwargs)
with open("to_do_list.txt", "a") as l:
# no need to iterate over the arguments
l.write(f"{res} n")
return res
return wrapper
@decorator
def to_do():
print("TO DO LIST")
status = True
list = []
while status:
x = input("Add a task to a list: ")
list.append(x)
q = input("Do you wanna continue typing (Y), or quit (Q)?").lower()
if q == "n":
status = False
return list
to_do()

你应该问问自己,装饰器是否是你想要使用的,因为正如Barmar答案下的评论中所提到的,你不可能不执行这个函数(你可以向装饰器添加参数,但正如所说,问问自己这是最简单的解决方案吗(。

这不应该用装饰器来完成。这重新定义了函数,并且只有当您想要对许多不同的函数进行常规修改时才应该使用。您不能再直接调用基函数,因此当基函数本身可用时,不应该使用它。

在Insted中,定义一个向文件写入列表的普通函数,然后用返回的值调用它。

def write_list_to_file(l, filename):
with open(filename, 'a') as f:
for item in l:
f.write(item + 'n'))
write_list_to_file(to_do(), "to_do_list.txt")

如果你真的想用decorator来实现这一点,你必须处理函数的结果,而不是参数。为了使decorator更通用,它应该将文件名作为参数,而不是硬编码?

def append_file(filename):
def decorator(func)
def wrapper(*args, **kwargs):
results = func(*args, **kwargs)
with open(filename, 'a') as f:
for item in results:
f.write(f'{item}n')
return results
return wrapper
return decorator
@append_file("to_do_list.txt")
def to_do():
print("TO DO LIST")
to_do_list = []
while True:
x = input("Add a task to a list: ")
to_do_list.append(x)
q = input("Do you wanna continue typing (Y), or quit (Q)?").lower()
if q == "n":
break
return to_do_list
to_do()

最新更新