Pythonic用很多参数编写函数/方法的方法

时间:2010-06-28 20:45:13

标签: python idioms idiomatic

想象一下:

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

这条线超越了79个字符,那么多线性的pythonic方式是什么?

8 个答案:

答案 0 :(得分:20)

您可以在括号(或括号)中加入换行符,例如

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

(当然,要包括的空白量取决于你)

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

def method(self, *args):
    pass

和/或

def method(self, **kwargs):
    pass

取决于您如何使用参数(以及您希望如何调用函数)。

答案 1 :(得分:13)

我认为'Pythonic'回答这个问题的方法是比语法更深入。传递一个方法的许多参数表明您的对象模型可能存在问题。

  1. 首先,你真的需要将这么多参数传递给这个方法吗?也许这表明在其他地方(通过已经可以访问变量的对象)可以更好地完成工作?

  2. 如果这确实是该方法的最佳位置,那么这些参数中的一些可以作为该对象本身的实例变量提供(通过self)吗?

  3. 如果没有,您可以重新定义父对象的职责以包含它们吗?

  4. 如果没有,您是否可以将任何单个参数封装在一个复合对象中,以正式化它们之间的关系?如果任何参数有任何共同点,那么这应该是可能的。

答案 2 :(得分:6)

我缩进后续第2行:

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

答案 3 :(得分:1)

如果你有一个函数需要这么多变量作为参数,你最不用担心的是缩进

答案 4 :(得分:1)

一旦79被击中,我就分开到开放式支架,如下所示:

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

如果名字太长而无法放在开头括号之后,我会这样做:

x.long_function_is_long(
    long_argument_is_loooooooooooooooooooooooooooooooooooooooong,
    longer_argument_is_looooooooooooooooooooooooooooooooooooooooonger
)

答案 5 :(得分:1)

另一种选择是在字典中传递参数。

答案 6 :(得分:0)

出于可读性考虑,我这样做是:

    file = load_sftp_file( SERVER_SFTP_HOST,
                           SERVER_SFTP_USER,
                           SERVER_SFTP_PASSWORD,
                           SERVER_SFTP_PRIVATE_KEY,
                           SERVER_SFTP_PATH,
                           FTP_DIR,
                           specific_filename=self.get_filename())

答案 7 :(得分:-2)

我通常这样做,我不知道它是否是最好的,但它确实有效。因为我必须分割线,所以我们将它们放得更长(如果可以的话):

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

此外,如果有大量相同的参数,请使用*args