2011-01-22 17 views
82

我有一個線以下的代碼(不命名約定怪,他們是不是我的):如何在Python中打破一連串的鏈式方法?

subkeyword = Session.query(
    Subkeyword.subkeyword_id, Subkeyword.subkeyword_word 
).filter_by(
    subkeyword_company_id=self.e_company_id 
).filter_by(
    subkeyword_word=subkeyword_word 
).filter_by(
    subkeyword_active=True 
).one() 

我不喜歡它的樣子(不要太可讀),但我不在這種情況下,將行限制爲79個字符更好。有沒有更好的方法打破它(最好是沒有反斜槓)?

回答

171

你可以使用額外的括號:

subkeyword = (
     Session.query(Subkeyword.subkeyword_id, Subkeyword.subkeyword_word) 
     .filter_by(subkeyword_company_id=self.e_company_id) 
     .filter_by(subkeyword_word=subkeyword_word) 
     .filter_by(subkeyword_active=True) 
     .one() 
    ) 
+0

我也很喜歡它。不添加更多代碼並且沒有反斜槓。 – 2011-01-22 23:17:53

+13

不確定在這裏額外縮進的理由是什麼;我認爲這個解決方案同樣如此,懸掛的線條只縮進一次,尾隨的不變。 – 2015-06-23 21:57:58

+0

在我看來,雙縮進在這裏很有用,因爲它在視覺上與正常的縮進塊不同。當被其他代碼包圍時,這使得它更加明顯,它是一個包裝單行。 – sth 2016-10-21 19:57:17

9

只需存儲中間結果/對象並調用其上的下一個方法,例如

q = Session.query(Subkeyword.subkeyword_id, Subkeyword.subkeyword_word) 
q = q.filter_by(subkeyword_company_id=self.e_company_id) 
q = q.filter_by(subkeyword_word=subkeyword_word) 
q = q.filter_by(subkeyword_active=True) 
subkeyword = q.one() 
+4

這適用於查詢之類的事情,但作爲一般模式,我不太確定。例如,當像`team_members = soup.find(class _ ='section team'),鏈接在Beautiful Soup中時,find_all('ul')。find_all('li')`,每個`.find()的返回值。 )`調用不符合`team_members`的含義。 – 2016-10-20 19:52:32

4

根據Python Language Reference
你可以用一個反斜槓。
或者乾脆打破它。如果支架未配對,python將不會將其視爲一條線。在這種情況下,下面幾行的縮進並不重要。

1

您似乎使用SQLAlchemy的,如果這是真的,sqlalchemy.orm.query.Query.filter_by()的方法需要多個關鍵字參數,所以你可以這樣寫:

subkeyword = Session.query(Subkeyword.subkeyword_id, 
          Subkeyword.subkeyword_word) \ 
        .filter_by(subkeyword_company_id=self.e_company_id, 
           subkeyword_word=subkeyword_word, 
           subkeyword_active=True) \ 
        .one() 

但它會更好:

subkeyword = Session.query(Subkeyword.subkeyword_id, 
          Subkeyword.subkeyword_word) 
subkeyword = subkeyword.filter_by(subkeyword_company_id=self.e_company_id, 
            subkeyword_word=subkeyword_word, 
            subkeyword_active=True) 
subkeuword = subkeyword.one() 
11

我個人的選擇將是:

 
subkeyword = Session.query(
    Subkeyword.subkeyword_id, 
    Subkeyword.subkeyword_word, 
).filter_by(
    subkeyword_company_id=self.e_company_id, 
    subkeyword_word=subkeyword_word, 
    subkeyword_active=True, 
).one() 
38

這是一種情況,其中行延續charac最好打開括號。對於需要這種風格變得更加明顯,因爲方法的名稱變長和方法開始服用參數:

subkeyword = Session.query(Subkeyword.subkeyword_id, Subkeyword.subkeyword_word) \ 
        .filter_by(subkeyword_company_id=self.e_company_id)   \ 
        .filter_by(subkeyword_word=subkeyword_word)     \ 
        .filter_by(subkeyword_active=True)       \ 
        .one()              \ 

PEP 8打算用常識性的一項措施,既實用和眼睛來解釋美麗。高興地違反任何PEP 8指南,導致醜陋或難以閱讀的代碼。

話雖這麼說,如果你經常在與PEP 8賠率發現自己,它可能是一個跡象,表明有超越你的空白的選擇:-)

4

這是一個有點比不同的解決方案的可讀性問題由其他人提供,但我最喜歡的,因爲它有時會導致漂亮的元編程。

base = [Subkeyword.subkeyword_id, Subkeyword_word] 
search = { 
    'subkeyword_company_id':self.e_company_id, 
    'subkeyword_word':subkeyword_word, 
    'subkeyword_active':True, 
    } 
subkeyword = Session.query(*base).filter_by(**search).one() 

這是一個很好的搜索技巧。通過複雜的查詢表單(或基於字符串的扣除關於用戶的查找內容)的條件列表,然後將字典分解到過濾器中。

1

我喜歡兩個街區縮進參數,並通過一個塊的語句,像這樣的:

for image_pathname in image_directory.iterdir(): 
    image = cv2.imread(str(image_pathname)) 
    input_image = np.resize(
      image, (height, width, 3) 
     ).transpose((2,0,1)).reshape(1, 3, height, width) 
    net.forward_all(data=input_image) 
    segmentation_index = net.blobs[ 
      'argmax' 
     ].data.squeeze().transpose(1,2,0).astype(np.uint8) 
    segmentation = np.empty(segmentation_index.shape, dtype=np.uint8) 
    cv2.LUT(segmentation_index, label_colours, segmentation) 
    prediction_pathname = prediction_directory/image_pathname.name 
    cv2.imwrite(str(prediction_pathname), segmentation) 
0

我知道這是一個老話題,但什麼:

subkeyword=(Session.query(Subkeyword.subkeyword_id, 
          Subkeyword.subkeyword_word) 
        .filter_by(subkeyword_company_id=self.e_company_id) 
        .filter_by(subkeyword_word=subkeyword_word) 
        .filter_by(subkeyword_active=True) 
        .one()) 

或者

subkeyword=(Session.query(Subkeyword.subkeyword_id, 
          Subkeyword.subkeyword_word) 
        .filter_by(subkeyword_company_id=self.e_company_id) 
        .filter_by(subkeyword_word=subkeyword_word) 
        .filter_by(subkeyword_active=True) 
        .one() 
      )