Python中的链式方法调用缩进风格

163 投票
2 回答
85576 浏览
提问于 2025-04-17 09:17

从阅读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

更新:有一个重复的问题,关于如何在Python中换行链式方法调用?被接受的答案建议使用一种类似jQuery的风格,在每一行的开头加一个点。作者没有提供任何理由或权威的参考,所以我想确认一下这种风格是否可行,或者有没有其他的替代方案。

2 个回答

97

我觉得最好的办法是用()来强制连接行,这样做:

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

虽然这不是最理想的方式,但我喜欢它在视觉上很突出,也让调用的顺序变得比较明显。这样做还允许在行末添加注释,而用\换行就不行。

254

在这种情况下,使用换行符比打开括号更合适。

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 有冲突,那可能说明你的代码在可读性上存在问题,不仅仅是空格的选择问题 :-)

撰写回答