web-dev-qa-db-ja.com

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文字に制限するより良いアイデアはありません。それを壊すより良い方法はありますか?

123
Juliusz Gonera

追加の括弧を使用できます。

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()
    )
230
sth

これは、括弧を開くよりも行継続文字が優先される場合です。このスタイルの必要性は、メソッド名が長くなり、メソッドが引数を取り始めるにつれて明らかになります。

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は、常識の尺度と実用的で美しい両方の目で解釈される予定です。 EPいコードや読みにくいコードをもたらすPEP 8ガイドラインに喜んで違反します。

とはいえ、PEP 8と頻繁に対立する場合は、空白の選択を超える読みやすさの問題があることを示している可能性があります:-)

49

私の個人的な選択は次のとおりです。

 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()
13
pkoch

中間結果/オブジェクトを保存し、その上で次のメソッドを呼び出すだけです。

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()
11

他の人が提供するソリューションとは少し異なるソリューションですが、私のお気に入りのメタプログラミングがときどき行われます。

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()

これは、検索を構築するための優れた手法です。複雑なクエリフォーム(またはユーザーが探しているものに関する文字列ベースの推論)からマイニングする条件のリストを調べて、辞書をフィルターに展開します。

Python言語リファレンス
バックスラッシュを使用できます。
または単にそれを破ります。ブラケットがペアになっていない場合、pythonはそれを行として扱いません。このような状況では、後続の行のインデントは重要ではありません。

3
Haozhun

SQLAlchemyを使用しているようです。trueの場合、 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()
1
minhee

次のように、引数を2つのブロックでインデントし、ステートメントを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)
1
acgtyrant