Я пытаюсь создать декоратор, который просматривает кучу файлов и применяет функцию к тексту.Проблема заключается в том, что упакованная функция должна получать текст, а возвращенная упакованная функция - нет.
Функция работает нормально, если я определяю ее, получая только параметры
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-файлов, когда это необходимо, и использовать этот декоратор, чтобы сделать вызов декорированной функции уже применяемой ко всем текстовым файлам в этой папке.