链式方法在Python中调用缩进样式

kat*_*ugh 95 python django coding-style pep8

从阅读PEP-8开始,我得知你应该将右括号放在与函数调用中最后一个参数相同的行上:

ShortName.objects.distinct().filter(
    product__photo__stockitem__isnull=False)
Run Code Online (Sandbox Code Playgroud)

也许,长表达最好避免.但是,如果这是不受欢迎的,你将如何进行多个链式方法调用?闭幕式是否应该换新线?

ShortName.objects.distinct().filter(
    product__photo__stockitem__isnull=False
).values_list('value', flat=True)
Run Code Online (Sandbox Code Playgroud)

那些无参数方法呢?如何在不引用中间返回值的情况下在多行上编写它们?

ShortName.objects.distinct(
    ).filter().values() # looks ugly
Run Code Online (Sandbox Code Playgroud)

更新:如何在Python中打破一系列链式方法有一个重复的问题.该接受的答案建议开始以点每个新线的熟悉从jQuery的风格.作者没有提供任何理由或权威参考,所以我想得到关于这种风格或替代方案的确认.

Ray*_*ger 156

这种情况下,行连续字符优先打开括号.

ShortName.objects.distinct() \
         .filter().values()      # looks better
Run Code Online (Sandbox Code Playgroud)

当方法名称变得更长并且方法开始采用参数时,对这种风格的需求变得更加明显:

return some_collection.get_objects(locator=l5) \
                      .get_distinct(case_insensitive=True) \
                      .filter(predicate=query(q5)) \
                      .values()
Run Code Online (Sandbox Code Playgroud)

PEP 8旨在通过常识和对实用和美丽的关注来解释.高兴地违反任何导致丑陋或难以阅读的代码的PEP 8指南.

话虽这么说,如果你经常发现自己与PEP 8不一致,这可能表明存在超出你选择的空白的可读性问题:-)

  • 不幸的是,这不允许在'\\`之后发表评论甚至是空格. (4认同)

小智 55

我认为最好是使用()来强制连接线,并执行此操作:

(ShortName.objects.distinct() # Look ma!
 .filter(product__photo__stickitem__isnull=False) # Comments are allowed
 .values_list('value', flat=True))
Run Code Online (Sandbox Code Playgroud)

它并不理想,但我喜欢它在视觉上突出,并使得调用链变得有些明显.它允许行尾注释,\换行不会.

  • 我不在乎.开括号内容尖叫着"我正在建立一个特定的家伙!" 在我和我的眼睛开始狩猎,看看将要做什么. (33认同)
  • @Zelphir Python中的元组运算符是逗号,而不是括号.这就是你必须写("a",)来制作1元组的原因.也就是说,逗号是一个中缀运算符,意思是"从左右项中创建一个元组".如果左项是元组,则运算符创建一个元组,其中包含左元组和右元组的项.这就是为什么Python中的解构是'a,b = [1,2]`而在像JavaScript这样的语言中它是`[a,b] = [1,2];`. (19认同)
  • 这种方法的优点是它允许评论. (5认同)
  • 这应该是*更好的*答案。关于 [最大行长度](https://www.python.org/dev/peps/pep-0008/#maximum-line-length) 的 PEP8 指南指出:“通过将表达式换行,可以将长行分成多行括号。应该优先使用这些括号而不是使用反斜杠来继续行。” (5认同)
  • @Zelphir Python会将它识别为元组,如果它有多个值(即`(1,2)`),或单个值后跟逗号(即`(1,)`).否则(当括号内只有一个表达式时)它只是执行它. (3认同)
  • @DejanLekic 7年前,当我写这篇文章时,它看起来不对。7年后的现在,我不会写那封信,但我也不会回去更新所有的旧答案。 (3认同)
  • @KirkStrauser - ...所以你每次使用括号来构建表达式时都会害怕,因为你认为你在“构建一个元组”?:) 我敢肯定你写了一个像`a2minusb2 = (a - b) * (a + b)` 这样的代码,而不必担心你正在构建元组!:) 括号不是构建元组 - 逗号(运算符)可以。`x = 4, 9, 2` 是完全有效的 Python 代码,x 是一个元组。 (2认同)
  • 缺少逗号的尖叫声是“我没建一个管!”。这是我最喜欢的答案。 (2认同)