用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并被接受,因为刚才回答的问题假设我不是白痴,并且解决方案与空格和制表符缩进兼容。