用Pythonic方式编写具有大量参数的函数/方法

用Pythonic方式编写具有大量参数的函数/方法,python,idioms,Python,Idioms,想象一下: def method(self, alpha, beta, gamma, delta, epsilon, zeta, eta, theta, iota, kappa): pass 这一行跨越了79个字符,那么,多行的python方式是什么呢?我将后面的行缩进2级: def method(self, alpha, beta, gamma, delta, epsilon, zeta, eta, theta, iota, kappa): pass 可以在

想象一下:

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

这一行跨越了79个字符,那么,多行的python方式是什么呢?

我将后面的行缩进2级:

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

可以在括号(或括号)中包含换行符,例如

(当然,包含的空白量取决于您)

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

def method(self, *args):
    pass
和/或

def method(self, **kwargs):
    pass

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

如果您有一个函数将如此多的变量作为参数,那么您最不需要担心的是缩进问题。

一旦遇到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
)
如果名字太长,不能放在开头的括号后面,我会这样做:

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
)

我通常这样做,我不知道这是否是最好的,但它是有效的。由于我必须拆分这条线,因此我将它们等长(如果可以的话):


此外,我建议使用与David相同数量的参数,使用
*args

我认为回答这个问题的“Pythonic”方法是深入研究语法。将这么多参数传递给一个方法表明对象模型可能存在问题

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

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

  • 如果没有,您能否重新定义父对象的职责以包含它们

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


  • 为了便于阅读,当我有长名字时,我会这样做:

        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())
    

    另一个选择是通过口述来传递参数。

    不过这不是一个真正的答案,是吗?我很想提高投票率,但是的。。。应该是注释。另一个+1表示
    *args
    **kwargs
    +1带括号的多行。我花了一段时间才明白你可以做到这一点,很多初学者都不知道它的方便性。跟丑八怪说再见吧!考虑将参数分组到所有的内嵌数据保持类中,我知道*ARGs,但是我不能以这种方式对参数进行分组,因为我使用Python的子集,不允许这种语法。\\字符是不必要的。在Python中,用括号分组允许代码跨越多行-这在PEP 8中指出。我不知道这一点。谢谢:)+1并被接受,因为刚才回答的问题假设我不是白痴,并且解决方案与空格和制表符缩进兼容。