我正在尝试创建一个装饰器,该装饰器遍历一堆文件并将该功能应用于文本。问题是包装函数需要接收文本,而返回的包装函数不需要。
如果我定义该函数仅接收参数,则该函数可以正常工作
import os
def manipulate( folder, func, *args, **kwargs ):
for file_name in os.listdir( folder ):
with open( file_name , 'r' ) as f:
text = ''.join(f.readlines())
func( text, *args, **kwargs )
with open( file_name , 'w' ) as f:
f.write(text)
但我希望我可以将其转换为装饰器
import os, functools
def manip( folder ):
def decorator( func ):
@functools.wraps( func )
def wrapper( *args, **kwargs ):
for file_name in os.listdir( folder ):
with open( file_name , 'r' ) as f:
text = ''.join(f.readlines())
func( text, *args, **kwargs )
with open( file_name , 'w' ) as f:
f.write(text)
return wrapper
return decorator
现在我是否有功能:
def add_after( text, after='to be added' ):
return text + after
manipulate('./MyFolder/', add_after)
操纵功能可以正常工作。
但是使用如下的manip装饰器:
@manip('./MyFolder/')
def add_after( text, after='to be added' ):
return text + after
manip()
给我错误:
Type Error: add_after() missing 1 required positional argument: 'text'
我无法弄清楚出了什么问题,或者我只是不应该尝试这样做。这个想法是为了能够创建util函数,以帮助我在需要时编辑一堆text / json文件,并使用此装饰器来调用已装饰的函数,而该函数本身已应用于该文件夹中的所有文本文件。