从阅读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样式,用点开始每个新行。作者没有提供任何理由或权威参考,所以我想得到关于这种风格或替代方案的确认。
答案 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))
这并不理想,但我喜欢它在视觉上突出,并且使得调用链变得有些明显。它允许行尾注释,\
换行符不会。