Python中的链式方法调用缩进风格
从阅读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 有冲突,那可能说明你的代码在可读性上存在问题,不仅仅是空格的选择问题 :-)