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

时间:2011-12-30 19:23:46

标签: python django coding-style pep8

从阅读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?有一个重复的问题。 accepted answer建议熟悉jQuery样式,用点开始每个新行。作者没有提供任何理由或权威参考,所以我想得到关于这种风格或替代方案的确认。

2 个答案:

答案 0 :(得分:139)

这种情况下,首先使用行继续符来打开括号。

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不一致,这可能表明存在超出您选择的空白的可读性问题: - )

答案 1 :(得分:49)

我认为最好的方法是使用()来强制加入行,并执行此操作:

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

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