如何在少重构原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
相关产品推荐
相关产品推荐

