列出路径+文件名,所有路径都以相同的root_dir
开头。我如何使用partial?
from os.path import join as path_join
from functools import partial
from tempfile import gettempdir
root_dir = gettempdir()
root_join = partial(path_join, path=root_dir)
root_join('foo')
然而,这会引发错误:
TypeError:join()获得了关键字参数'path'的多个值
显然我可以写一个新功能:
root_join = lambda root=root_dir, *a: path_join(root_dir, *a)
但是我想用partial
来解决这个问题。有什么线索?
答案 0 :(得分:3)
只需删除关键字参数即可:
root_join = partial(path_join, root_dir)
示例输出:
>>> print root_join('foo')
/tmp/foo
partial()
将关键字参数和位置参数传递给包装函数,这些参数与调用结果部分函数时传递的参数相结合,因此:
partial_func = partial(func, positional_1, positional_2, keyword_1='A', keyword_2='B')
partial_func(positional_3, keywork_2='B')
相当于:
func(positional_1, positional_2, positional_3, keyword_1='A', keyword_2='B')
请注意,位置参数按顺序组合,首先是部分参数,然后是在调用时提供的参数。与往常一样,它们也出现在关键字参数之前。
这意味着您的代码:
root_join = partial(path_join, path=root_dir)
root_join('foo')
相当于:
path_join('foo', path=root_dir)
在这里,' foo'作为os.path.join(path, *p)
的path
参数在位置上给出,然后尝试将path
指定为关键字参数。
答案 1 :(得分:2)
根据os.path.join()
的定义,os.path.join()
的第一个参数的名称为path
。因此,通过path
提供functools.partial
参数作为命名关键字参数会生成在同一个键上传递多个值的尝试。
由于functools.partial()
也支持提供位置参数,你可以试试这个:
>>> import functools
>>> import os.path
>>> root_join = functools.partial(os.path.join, 'root')
>>> root_join('path/to/somewhere')
'root/path/to/somewhere'