如何创建将参数发送给函数的装饰器

时间:2019-05-09 18:38:56

标签: python python-3.x decorator wrapper

我正在尝试创建一个装饰器,该装饰器遍历一堆文件并将该功能应用于文本。问题是包装函数需要接收文本,而返回的包装函数不需要。

如果我定义该函数仅接收参数,则该函数可以正常工作

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文件,并使用此装饰器来调用已装饰的函数,而该函数本身已应用于该文件夹中的所有文本文件。

0 个答案:

没有答案