Python中functools.partial()函数的基础用法与参数冻结

栗子
栗子
发布时间:2026-10-11| 3人浏览过
原创

本文介绍Python中functools.partial()函数的基础用法。partial()允许用户为已有函数预填充部分参数,从而生成一个新的可调用对象。文章通过int()函数的示例演示了如何冻结base参数,并详细解析了partial对象的内部属性(func, args, keywords)。此外,还说明了partial()不保留原函数元数据的特性及手动修复方法。

partial()函数的核心作用

在Python中,functools.partial() 是一个非常有用的工具,主要用于“携带部分参数生成新函数”。它的核心功能是冻结函数的部分参数,并返回一个新的函数对象。这个新函数在调用时,会自动使用之前冻结的参数,同时允许用户传入剩余未冻结的参数。

基础示例:基于int()的进制转换

为了直观理解,我们可以利用Python内置的 int() 函数作为示例。通常,int() 用于将数值转换为十进制整数,但在转换字符串时,它可以指定解析进制(base)。

>>> int("123")
123

# 以2进制解析10101,并转换成10进制整数
>>> int("10101", base=2)
21

# 以13进制解析"abc12c",并转换成10进制整数
>>> int("abc12c", base=13)
4053672

如果我们经常需要进行二进制转换,每次都要显式传入 base=2 会显得繁琐。我们可以使用 partial() 将 int 函数封装,并固定 base=2。

方法一:手动定义包装函数

不使用 partial 时,我们通常这样写:

def inttwo(x):
    return int(x, base=2)

inttwo("10101")

方法二:使用partial()

使用 functools.partial 可以更简洁地实现相同功能:

from functools import partial

inttwo = partial(int, base=2)

# 调用时只需传入未冻结的参数
>>> inttwo("10101")
21

partial()对象的内部结构

通过 partial() 生成的对象是一个 partial 对象。我们可以通过 dir() 查看其包含的关键属性,主要包括:func、args 和 keywords。

>>> dir(inttwo)
[...... 'args', 'func', 'keywords']

这些属性的具体含义如下:

  • func:表示被封装的原始函数(本例中为 <class 'int'>)。
  • args:表示冻结的位置参数(本例中为空元组 ())。
  • keywords:表示冻结的关键字参数(本例中为 {'base': 2})。
>>> inttwo.func
<class 'int'>
>>> inttwo.args
()
>>> inttwo.keywords
{'base': 2}

覆盖冻结参数

一个重要的特性是:partial() 冻结的参数可以被再次指定覆盖。如果在调用生成的新函数时,显式传入了与冻结参数同名的关键字参数,新传入的值将覆盖 partial 中预设的值。

# 虽然inttwo默认base=2,但调用时显式指定base=10
>>> inttwo("10101", base=10)
10101

partial()的局限性:元数据丢失

使用 partial() 包装后的函数,默认情况下不保留原函数的元数据(如文档字符串 __doc__ 和类型注解 __annotations__)。如果需要保留这些信息,必须手动赋值。

示例:手动恢复元数据

假设有一个带有文档和类型注解的函数:

def myfunc(x:int, y:int) -> int:
    ''' sum x + y '''
    return x + y

# 查看原函数元数据
>>> myfunc.__doc__
' sum x + y '
>>> myfunc.__annotations__
{'x': <class 'int'>, 'y': <class 'int'>, 'return': <class 'int'>}

使用 partial 包装后:

newfunc = functools.partial(myfunc, y=3)

# 此时 newfunc 没有原函数的元数据

为了恢复元数据,我们需要手动将原函数的属性赋值给 newfunc:

>>> newfunc.__doc__ = myfunc.__doc__
>>> newfunc.__annotations__ = myfunc.__annotations__
>>> newfunc.__doc__
' sum x + y '
>>> newfunc.__annotations__
{'x': <class 'int'>, 'y': <class 'int'>, 'return': <class 'int'>}

总结

functools.partial() 是Python中实现函数柯里化(Currying)和参数预填充的强大工具。它通过冻结部分参数生成新函数,提高了代码的复用性和简洁性。需要注意的是,partial 对象会丢失原函数的元数据,必要时需手动恢复。此外,functools 模块还提供了 partialmethod() 用于冻结类方法的参数,适用于面向对象编程场景。

以上就是Python中partial()基础用法说明的详细内容,更多关于Python高阶函数和functools模块的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。