Python 的函数柯里化(Currying)
柯里化是一种将多参数函数转换为一系列单参数函数的技术。在 Python 中,可以通过多种方式实现柯里化。
基本概念
柯里化的基本思想是:一个接收多个参数的函数,可以转换为接收单一参数(最初函数的第一个参数)的函数,并返回接收余下参数的新函数。
手动实现柯里化
# 原始多参数函数
def add(a, b, c):return a + b + c# 手动柯里化版本
def add_curried(a):def inner1(b):def inner2(c):return a + b + creturn inner2return inner1# 使用方式
result = add_curried(1)(2)(3) # 输出: 6
print(result)
functools.partial
允许你固定一个函数的部分参数,创建一个新的函数:
from functools import partialdef multiply(x, y):return x * y# 创建新函数,固定第一个参数为 2
double = partial(multiply, 2)
print(double(5)) # 输出: 10 (相当于 multiply(2, 5))
例子
import functools
from typing import Any, Callable, Generic, List, TypeVar
from fastapi import APIRouterdef route(router: APIRouter,path: str,methods: List[str],response_model=None,**options
):passget = functools.partial(route, methods=['GET'])
post = functools.partial(route, methods=['POST'])
put = functools.partial(route, methods=['PUT'])
delete = functools.partial(route, methods=['DELETE'])
2. 代码中的作用
get = functools.partial(route, methods=['GET'])
这相当于:
def get(router: APIRouter, path: str, response_model=None, **options):return route(router, path, methods=['GET'], response_model=response_model, **options)
6. 底层实现原理
functools.partial
实际上创建了一个包装器:
# 近似实现
def partial(func, *fixed_args, **fixed_kwargs):def wrapper(*args, **kwargs):# 合并固定参数和新参数new_args = fixed_args + argsnew_kwargs = {**fixed_kwargs, **kwargs}return func(*new_args, **new_kwargs)return wrapper
优势总结
1. 一致性 所有路由装饰器都有相同的接口
2. 可读性 @get
, @post
比 @route(methods=['GET'])
更直观
3. 减少错误 避免手写 methods=['GET']
时的拼写错误
4. 易于扩展 如果需要修改所有 GET 请求的行为,只需修改 route
函数