как создать декоратор, который посылает аргумент функции - PullRequest
0 голосов
/ 09 мая 2019

Я пытаюсь создать декоратор, который просматривает кучу файлов и применяет функцию к тексту.Проблема заключается в том, что упакованная функция должна получать текст, а возвращенная упакованная функция - нет.

Функция работает нормально, если я определяю ее, получая только параметры

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('./MyFolder/')
def add_after( text, after='to be added' ):
    return text + after

manip()

, выдает мне ошибку:

Type Error: add_after() missing 1 required positional argument: 'text'

Я не могу понять, что не так, или если я просто не должен 'не пытаться сделать это так.Идея состоит в том, чтобы иметь возможность создавать утилиты, помогающие мне редактировать кучу текстовых / json-файлов, когда это необходимо, и использовать этот декоратор, чтобы сделать вызов декорированной функции уже применяемой ко всем текстовым файлам в этой папке.

...