2

有一个路径 + 文件名的列表,都以相同的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() 为关键字参数“路径”获取了多个值


显然我可以写一个新函数:

root_join = lambda root=root_dir, *a: path_join(root_dir, *a)

但是我想使用partial. 任何线索如何?

4

2 回答 2

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' 作为位置path参数给出os.path.join(path, *p),然后尝试将path其作为关键字参数进行赋值。

于 2015-02-12T12:04:03.467 回答
2

根据os.path.join()的定义, for 第一个参数的名称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'
于 2015-02-12T12:07:52.167 回答