Python中functools.partial()函数的基础用法与参数冻结
本文介绍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")
21partial()对象的内部结构
通过 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)
10101partial()的局限性:元数据丢失
使用 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模块的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









