如何在os.path.join中使用functools.partial?

时间:2015-02-12 11:58:52

标签: python functional-programming default-arguments partial-application functools

列出路径+文件名,所有路径都以相同的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来解决这个问题。有什么线索?

2 个答案:

答案 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'