144

通过阅读 PEP-8,我知道您应该将右括号与函数调用中的最后一个参数放在同一行:

ShortName.objects.distinct().filter(
    product__photo__stockitem__isnull=False)

可能,最好避免使用长表达式。但如果它不受欢迎,你将如何处理多个链式方法调用?结束括号是否应该在新行上?

ShortName.objects.distinct().filter(
    product__photo__stockitem__isnull=False
).values_list('value', flat=True)

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

ShortName.objects.distinct(
    ).filter().values() # looks ugly

更新: How to break a line of chained methods in Python?有一个重复的问题?. 接受的答案暗示了一种熟悉的 jQuery 风格,即以点开头的每一行。作者没有提供任何理由或权威参考,所以我想对这种风格或替代方案进行确认。

4

2 回答 2

228

这是一个行继续字符优于开括号的情况。

ShortName.objects.distinct() \
         .filter().values()      # looks better

随着方法名称变长并且方法开始接受参数,对这种风格的需求变得更加明显:

return some_collection.get_objects(locator=l5) \
                      .get_distinct(case_insensitive=True) \
                      .filter(predicate=query(q5)) \
                      .values()

PEP 8 旨在以一定程度的常识和对实用和美观的眼光来解释。高兴地违反任何导致丑陋或难以阅读的代码的 PEP 8 准则。

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

于 2011-12-30T19:29:54.507 回答
86

我认为最好是使用 () 来强制加入行,并这样做:

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

这并不理想,但我喜欢它在视觉上脱颖而出,并使调用链的含义有些明显。它允许行尾注释,而\换行符不允许。

于 2011-12-30T19:32:41.827 回答