【问题标题】:How to use functools.partial with os.path.join?如何将 functools.partial 与 os.path.join 一起使用?
【发布时间】:2015-02-12 11:58:52
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

    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 也分配为关键字参数。

    【讨论】:

    • xD,这很简单。不知道为什么我认为partial 只适用于关键字 args...
    【解决方案2】:

    根据os.path.join()的定义,os.path.join()的第一个参数名称为path。因此,通过 functools.partial 提供 path 参数作为命名关键字参数会尝试在同一个键上传递多个值。

    由于functools.partial() 也支持提供位置参数,你可以试试这个:

    >>> import functools
    >>> import os.path
    >>> root_join = functools.partial(os.path.join, 'root')
    >>> root_join('path/to/somewhere')
    'root/path/to/somewhere'
    

    【讨论】:

      猜你喜欢
      • 2017-12-31
      • 2018-01-28
      • 2014-10-02
      • 2021-01-02
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 2014-09-25
      • 2016-01-30
      相关资源
      最近更新 更多