Context
Я пишу функцию, movefileset () , которая перемещает список файлов в различные места назначения.Глобальное выражение используется для получения списка путей к файлам.
movefileset () принимает хук, seek_func
, в качестве параметра, который будет вызываться для каждого пути к файлу в списке путей к файлам.Хук должен возвращать каталог, куда должен быть перемещен файл. movefileset () затем выполняет операцию перемещения (вместе с некоторой задачей бухгалтерского учета).
# Used for book-keeping
tftb_entry = namedtuple('TransferTableEntry', ['FileNumber', 'SourceFile', 'Destination','FileDate'])
def movefileset(searchpath, globexpr, seek_func=None):
'''seek_func is a function that takes a filename and returns the path'''
if seek_func == None:
logger.error("movefileset() failed: No seek_func provided. Check PyArchiver.py.")
return
# Get a list of files from `searchpath` using glob expression
source_filepaths = glob(os.path.join(searchpath, globexpr))
# Create a TransferTableEntry for each file returned by the glob operation, store them in a list
transfertable = list()
for filenum, sourcefilepath in enumerate(source_filepaths, 1):
destination_directory = seek_func(filename)
new_entry = tftb_entry(filenum, sourcefilepath)
...
Постановка задачи
У меня вопрос по поводу destination_directory = seek_func(filename)
.Как кто-то, кто пишет movefileset () , кто не знает, какой будет функция, переданная как seek_func
, кто не может предвидеть аргументы, которые ей нужны, как мне написать movefileset () так что вызов будет успешным независимо от того, что такое seek_func
и независимо от того, какие аргументы / ключевые аргументы он принимает?
Возможное решение
В SO: Как передать параметры для перехвата запросов Python , решение предложило построить hook_factory.Я не очень хорошо разбираюсь в шаблонах проектирования (и это похоже на «фабричный» шаблон проектирования), поэтому я не уверен, как именно должен использоваться hook_factory (и кем).
Я предполагаю, что код, вызывающий movefileset () , должен будет вызвать hook_factory () с seek_func
, аргументы / kwargs для seek_func
и hook_factory () вернет ловушку, которая принимает один аргумент (filepath), который затем должен быть передан movefileset () .
В этом случае что-то вроде:
def seek_func_factory(seek_func, *seek_func_args, **seek_func_kwargs):
def seek_func_hook(filepath):
return seek_func(filepath, *seek_func_args, **seek_func_kwargs)
return seek_func_hook
Но для этого мне, как автору movefileset () , необходимо указать в документации, что все seek_func
хуки должныпринять filename
в качестве первого позиционного аргумента.Что делать, если код, который задает seek_func
, вообще не использует filename
(например, пользователь хочет переместить все глобированные файлы в один каталог).Например:
def move_to_single_directory():
return r'C:\DestinationFolder'
Клиенту потребуется определить его следующим образом:
def move_to_single_directory(filepath):
return r'C:\DestinationFolder'