Как определить функцию, которая использует хуки? - PullRequest
0 голосов
/ 21 июня 2019

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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...