Python functools.partial等价代码重构方案的合理性咨询
关于
functools.partial重构方案的合理性分析 首先先回顾下Python官方给出的functools.partial的大致等价实现,这是我们对比的基准:
def partial(func, *args, **keywords): def newfunc(*fargs, **fkeywords): newkeywords = keywords.copy() newkeywords.update(fkeywords) return func(*args, *fargs, **newkeywords) newfunc.func = func newfunc.args = args newfunc.keywords = keywords return newfunc
接下来咱们逐个分析你的两个重构方案:
第一个重构方案:关键字参数处理逻辑错误
你的第一个重构代码如下:
def partial(func, *args, **keywords): def newfunc(*fargs, **fkeywords): return func(*args, *fargs, **fkeywords, **keywords) newfunc.func = func newfunc.args = args newfunc.keywords = keywords return newfunc
这个方案不合理。核心问题出在关键字参数的处理上:官方实现的逻辑是「预定义的关键字参数会被调用时传入的关键字参数覆盖」——通过keywords.copy()后用fkeywords更新,就能保证后传入的键优先级更高。但你的写法是直接把**fkeywords和**keywords同时拆包传给func,如果两个字典存在同名键,Python会直接抛出TypeError,完全违背了partial的预期行为。
第二个重构方案:参数处理存在语法和逻辑错误
你的第二个重构代码是这样的:
def partial(func, *args, **keywords): def newfunc(*fargs, **fkeywords): newkeywords = keywords.copy() newargs = args.copy() newkeywords.update(fkeywords) args.append(fargs) return func(*args, **newkeywords) newfunc.func = func newfunc.args = args newfunc.keywords = keywords return newfunc
这个方案同样不合理,有两个致命问题:
args是元组类型,元组没有copy()方法,直接调用args.copy()会触发AttributeError;- 你试图修改外部函数的
args参数(args.append(fargs)),但元组是不可变类型,这行代码会直接报错。就算你改成操作newargs,原逻辑是把预定义的位置参数args和调用时传入的fargs平铺后传递(也就是*args, *fargs),而你把fargs作为单个元素追加到参数列表里,最终传递给func的位置参数会变成(原args的元素, fargs元组),完全不符合原逻辑的参数传递方式,会导致目标函数调用失败。
总的来说,这两个重构方案都没有正确复现functools.partial的核心逻辑,第一个破坏了关键字参数的覆盖规则,第二个则在位置参数的处理上存在语法和逻辑错误。
内容的提问来源于stack exchange,提问作者Wizard




