如何定义一个使用钩子的函数?

时间:2019-06-20 21:57:42

标签: python hook

上下文

我正在编写一个函数 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: How to pass parameters to hook in python grequests中,该解决方案建议构建一个hook_factory。我对设计模式不熟悉(这看起来像“工厂”设计模式),所以我不确定应如何准确地使用hook_factory(以及由谁使用)。

我猜测调用 movefileset()的代码将需要使用seek_func,参数/ kwargs到{{1}来调用 hook_factory() }和 hook_factory()将返回一个带有单个参数(文件路径)的钩子,然后将其传递给 movefileset()

在这种情况下,类似:

seek_func

但这是我的要求,因为 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 挂钩都应将seek_func作为第一个位置参数。如果指定filename的代码根本不使用seek_func(例如,用户希望将所有全局文件移动到单个目录),该怎么办?例如:

filename

将要求客户端以这种方式进行定义:

def move_to_single_directory():
   return r'C:\DestinationFolder'

0 个答案:

没有答案