编写具有大量参数的Python函数/方法的优雅方式

24 投票
9 回答
17388 浏览
提问于 2025-04-16 00:32

想象一下:

def method(self, alpha, beta, gamma, delta, epsilon, zeta, eta, theta, iota, kappa):
    pass

这一行超过了79个字符,那么,用Python的方式怎么把它分成多行呢?

9 个回答

23

我觉得用“Pythonic”的方式来回答这个问题,应该深入思考,不仅仅看语法。传递这么多参数给一个方法,可能说明你的对象设计有问题。

  1. 首先,你真的需要给这个方法传这么多参数吗?也许这说明这些工作可以在别的地方更好地完成,比如由一个已经能访问这些变量的对象来处理?

  2. 如果这个方法确实是最合适的地方,那有没有可能把其中一些参数作为这个对象本身的实例变量(通过self)来提供呢?

  3. 如果不行,那能不能重新定义父对象的职责,把这些参数包含进去?

  4. 如果还是不行,能不能把某些单独的参数封装成一个组合对象,这样可以明确它们之间的关系?如果这些参数之间有共同点,那这样做应该是可行的。

35

你可以在括号里加换行,比如这样:

def method(self, alpha, beta, gamma, delta, epsilon, zeta,
                 eta, theta, iota, kappa):
    pass

(里面的空白量当然是你自己决定的)

不过在这种情况下,你也可以考虑

def method(self, *args):
    pass

和/或

def method(self, **kwargs):
    pass

这要看你怎么使用这些参数(以及你希望这个函数怎么被调用)。

9

我把后面的行缩进了两个级别:

def method(self, alpha, beta, gamma, delta, epsilon, zeta, eta,
        theta, iota, kappa):
    pass

撰写回答