如何将functools.partial与os.path.join一起使用? - python

具有路径和文件名的列表,所有路径均以相同的root_dir开头。如何使用部分?

尝试

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解决这个问题。有什么线索吗?

python大神给出的解决方案

只需删除关键字参数,它将起作用:

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'作为位置pathos.path.join(path, *p)参数,然后尝试将path分配为关键字参数。