You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在少重构原Python函数的前提下减少其参数数量?

从多参数函数过渡到类参数函数的捷径

假设你有一个包含大量参数的函数:

def operator(a, b, c, d, e, f, o):
    if o == 'a':
        return a + b + c + d + e + f
    if o == 'b':
        return a + b + d + d + e - f 

为了规避Pylint的“参数过多”警告,你用类封装了部分参数:

class InputEntry:
    def __init__(self, a, b, c, d, e, f):
        self.a = a
        self.b = b    
        self.c = c    
        self.d = d    
        self.e = e    
        self.f = f    

input_item = InputEntry(1,2,3,4,5,6)

现在要编写operator_v2,不想手动把类的每个属性都赋值到局部变量,这里有几个实用捷径:

捷径1:一键导入类属性到局部命名空间

直接通过vars()获取实例的属性字典,更新到函数的局部作用域里,原函数的核心代码完全不用修改:

def operator_v2(input_item, o):
    # 把input_item的所有实例属性导入当前局部变量
    locals().update(vars(input_item))
    
    # 原函数代码直接复用
    if o == 'a':
        return a + b + c + d + e + f
    if o == 'b':
        return a + b + d + d + e - f   

捷径2:用dataclass简化类定义(顺便解决类初始化参数多的问题)

如果觉得手动写__init__太繁琐,用Python3.7+的dataclasses可以自动生成初始化方法,大幅简化类代码:

from dataclasses import dataclass

@dataclass
class InputEntry:
    a: int
    b: int
    c: int
    d: int
    e: int
    f: int

input_item = InputEntry(1,2,3,4,5,6)

结合捷径1的方法,就能快速完成改造。

捷径3:用attrgetter批量解包属性

如果不想直接修改局部命名空间,用operator.attrgetter可以一行完成多属性的解包,比手动赋值简洁得多:

from operator import attrgetter

def operator_v2(input_item, o):
    # 一次性获取并解包需要的属性
    a, b, c, d, e, f = attrgetter('a', 'b', 'c', 'd', 'e', 'f')(input_item)
    
    if o == 'a':
        return a + b + c + d + e + f
    if o == 'b':
        return a + b + d + d + e - f   

内容的提问来源于stack exchange,提问作者Chungji

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 08:01:21