我正在编写一个函数 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'