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

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

有一个路径+文件名列表,全部以相同的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() got multiple values for keyword argument 'path'


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

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

但是我想使用 partial 来解决这个问题。有什么线索吗?

最佳答案

只需删除关键字参数即可工作:

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 指定为关键字参数。

关于python - 如何将 functools.partial 与 os.path.join 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28476884/

相关文章:

python - 获取对应的类到predict_proba(GridSearchCV sklearn)

Python 原生协程和 send()

c++ - 使用回调来自定义类而不是子类化

logging - 自动找出 f# 中的函数名称

c++ - 具有默认参数的成员初始化列表

swift - 将默认参数值发送给函数?

python - 在Python中,我需要保护多线程进程之间的数据传输吗?

python - 如果它在 pycharm 中工作,如何修复 'modulenotfounderror'?

sorting - 代码形式的批判 Real World Haskell,第 3 章练习

c++ - 为什么具有默认分配参数的函数不被接受为 0-arg 生成器?