在 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 类似的风格,即在每一行开始时使用一个点。作者没有提供任何理由或权威的参考,所以我想得到这样的风格或替代方案的确认。

77973 次浏览

在这种情况下,行继续字符优先于打开括号。

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不一致,这可能是一个信号,表明存在可读性问题,这些问题超出了您选择空格的范围: -)

我认为最好的方法是使用()来强制连线,并且这样做:

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

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