具有路径和文件名的列表,所有路径均以相同的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'作为位置path
的os.path.join(path, *p)
参数,然后尝试将path
分配为关键字参数。