【问题标题】:Pythonic way to write functions/methods with a lot of arguments使用大量参数编写函数/方法的 Pythonic 方式
【发布时间】:2011-03-09 08:05:16
【问题描述】:

想象一下:

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

该行超过了 79 个字符,那么,pythonic 的多行方式是什么?

【问题讨论】:

  • 考虑将参数分组到内聚的数据保存类中
  • 总而言之,我知道 *args,但我不能以这种方式对参数进行分组,因为我使用的 Python 子集不允许这种语法。

标签: python idioms


【解决方案1】:

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

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

(当然,要包含的空格数量取决于您)

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

def method(self, *args):
    pass

和/或

def method(self, **kwargs):
    pass

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

【讨论】:

  • *args**kwargs 的另一个 +1
  • +1 多行带括号。我花了一段时间才弄清楚你可以做到这一点,而且很多初学者都没有意识到它的便利性。和丑陋说再见!
【解决方案2】:

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

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

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

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

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

【讨论】:

    【解决方案3】:

    我将后面的行缩进 2 级:

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

    【讨论】:

    • +1 并被接受,因为假设我不是白痴就回答了这个问题,并且该解决方案与空格和制表符缩进兼容。
    【解决方案4】:

    一旦击中 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】:

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

        • 虽然不是真正的答案,是吗?
        • 我非常想给这个投票,但是是的......应该是评论。
        【解决方案7】:

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

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

        【讨论】:

          【解决方案8】:

          我会这样写

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

          我觉得它看起来又漂亮又干净

          【讨论】:

            【解决方案9】:

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

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

            另外,有这么多的参数我会推荐和大卫一样,使用*args

            【讨论】:

            • \ 字符是不必要的。在 Python 中,使用括号进行分组允许代码跨越多行 - PEP 8 python.org/dev/peps/pep-0008 中指出了这一点。
            • 不知道。谢谢:)
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-10-13
            • 2012-08-26
            • 2020-02-09
            • 2014-09-17
            相关资源
            最近更新 更多