在 Python 中中断嵌套 function/constructor 调用的正确方法是什么?

What's the proper way to break nested function/constructor calls in Python?

根据 PEP 8:

When using a hanging indent the following considerations should be applied; there should be no arguments on the first line and further indentation should be used to clearly distinguish itself as a continuation line.

假设我有这样的东西:

my_object = VeryLongClassName(long_function_name(arg1, arg2), arg3)

超过 79 个字符。我应该这样打破吗:

my_object = VeryLongClassName(
        long_function_name(arg1, arg2), arg3)

还是这个?

my_object = VeryLongClassName(long_function_name(
        arg1, arg2), arg3)

我使用以下方法,它可以在各种情况下很好地扩展,并且倾向于保持行的简短——从而使代码更容易在视觉上扫描。

my_object = VeryLongClassName(
    long_function_name(arg1, arg2),
    arg3,
)

这种方法还有一些额外的好处:

  • 在定义large data structures(列表、字典,甚至JSON)时被广泛使用。使用模仿您的数据布局风格的编码风格很方便。代码只是另一种形式的数据,对吧?

  • 它适用于大多数文本编辑器,它们从面向行的角度处理世界。如果函数或构造函数的每个参数都在单独的一行上,代码重构就很容易。

  • 它的应用是基于规则的,纯机械的。我永远不必为如何缩进代码而烦恼。

  • 这样一来,看起来很整洁,治理原则也一目了然。作为对比,PEP 8 中看到的 indenting examples 在我看来就像一个大杂烩,因此没有提供非常明确的指导。

另一种策略是使用局部便利变量,尤其是在需要在一个方法中多次使用长名称的情况下。尽管创建简短的助记符有可能使代码更加晦涩难懂,但它通常有助于提高可读性,前提是您的代码已经组织在相当小的函数或方法中——同样是因为它往往会增强代码的视觉扫描的便利性。

vlcn = VeryLongClassName
lfn = long_function_name
x = vlcn(lfn(arg1, arg2), arg3)
y = vlcn(lfn(arg4, arg5), arg6)