2011-12-30 49 views
63

縮進風格從閱讀PEP-8,我明白了,你應該把右括號放在同一行中函數的最後一個參數調用:鏈式方法調用在Python

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風格開始,每個新行都帶有一個點。作者沒有提供任何理由或權威參考,所以我想獲得關於這種風格或其他選擇的確認。

回答

103

這是一種情況,其中行延續字符是首選打開括號。

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

我喜歡這種方法。它還有一個很大的優點,就是可以在不用擔心標點符號的情況下移動文本行(除了第一行和最後一行)。在處理複雜的SQLAlchemy查詢時,我主要使用鏈接調用,並且很容易重新排列它們。 – 2011-12-30 19:32:30

+1

確實看起來更好,並且您還縮進了評論。謝謝! – katspaugh 2011-12-30 19:37:17

+0

Raymond,Python不允許在點之前和之後添加新行的原因是什麼?這使好的格式化變得更加容易... – 2013-04-01 18:45:56

35

可讀性問題,我認爲最好的方法是使用( )強制連線,而要做到這一點:

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

它的效果並不理想,但我喜歡它在視覺上突出出來,並使得有些什麼明顯的呼叫鏈。它允許行尾註釋,其中\換行符不會。

+26

我不在乎。左括號尖叫「我建立了一個TUPLE!」在我和我的眼睛開始四處尋找,看看將要做什麼。 – 2011-12-30 19:45:31

+0

建立'元組'也可能意味着*開始一系列的解釋* - 哇,這就是我的意思..! – 2015-04-01 02:06:14

+0

Python如何將它與一個元組區分開來? o0 – Zelphir 2016-11-25 16:01:19