2011-01-22 8 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

あなたは追加の括弧を使用することができます。
または単にそれを壊す。括弧がペアになっていない場合、Pythonはそれを行として扱いません。そのような状況下では、次の行のインデントは問題ではありません。

+0

私はそれが一番好きです。コードを追加しません。バックスラッシュはありません。 –

+13

余分な字下げを正当化する理由は不明です。私は、このソリューションはちょうど一度だけインデントされた垂れ下がった行と末尾の括弧がまったく読み込まれないように読んでいると思います。 –

+0

私の意見では、二重インデントは、通常のインデントブロックとは視覚的に異なるため、ここでは便利です。他のコードに囲まれていると、折り返した1行であることがより明確になります。 – sth

9

中間の結果/オブジェクトを保存し、次のメソッドを呼び出すだけです( など)。あなたは、バックスラッシュを使用することができますPython Language Reference
によると

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

これはクエリのようなものでも、一般的なパターンとしてはうまくいきますが、わかりません。例えば、美しいスープを 'team_members = soup.find(class _ = 'セクションチーム')のように連鎖させると、find_all( 'ul')、find_all( 'li')'、各 '.find(.. ) 'callは' team_members'の意味にまだ合っていません。 –

4

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

あなたはそれが本当であるならば、あなたは次のように書くことができるので、sqlalchemy.orm.query.Query.filter_by()方法は、複数のキーワード引数をとり、SQLAlchemyのを使用しているようだ:

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

+1 SQLAlchemy filter_by()ヒントです。この例ではうまくいきますが、filter()を使用して1つの条件しか受け付けないことがよくあります。 –

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

いくつかのパラメータが渡されても、0または1のパラメータが共通していると醜く見えることに同意します。たとえば、次のようになります。https://gist.github.com/andybak/b23b6ad9a68c7e1b794d –

+1

ええ、そのスタイルには縮退したケースがあります(どのようなスタイルでも同じです)。私はすべての開いた括約を破ることはありません。これは私を幸せにしてくれるものではありませんが、いくつかのケースがあります。https://gist.github.com/pkoch/8098c76614765750f769 – pkoch

38

これは、行継続charac括弧を開くにはterが優先されます。メソッドは、引数を取り始めるとメソッド名が長くなると、このスタイルの必要性がより明白になっ:

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と対立し、自分自身を見つけた場合、

+2

バックスラッシュで+1し、この特定のケースで連鎖フィルタを整列させます。この状況はDjangoでも発生し、このように最も読みやすいですが、他の状況では、カッコで囲まれたフレーズが優れているように感じられます(「バックスラッシュ後に空白がありますか?」という問題があります)。つまり、フレーズを括弧でくくっても同じ効果が得られますが、Pythonを読んでいる途中でLispの読み込みモードになってしまいます。 – zxq9

+7

私は、この解決策が「メソッド名が長くなり、メソッドが引数をとるようになるにつれて、外側の括弧で囲む」または「開いている括弧の後に改行する」と「各閉じる括弧"ソリューション。実際には、(少なくともここに示されているように)それを扱う際には悪化します。なぜなら、すべてのぶら下がった行に対してより深いインデントを必要とするからです。 –

+1

フィルタ呼び出しがあまりにも多くインデントされます。 1つのタブまたは4つのスペースで十分でした。 '\'のアライメントも...スペースキーを何秒間押し続けましたか?一般的に私はすべての方法に反対しています。これは、明日がないようにスペースキーを叩く必要があります。 – Zelphir

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

私は2つのブロックで引数をインデントしたい、とこのような一つのブロックの声明、:

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() 
      ) 
関連する問題