2012-01-06 22 views
1

以下の関数で行をインデント/書式設定するにはどうすればよいでしょうか?あるいは、これを1つのライナーとして書くつもりはないでしょうか?長いpython行の書式設定

def rects_bound(rects): 
    """ Returns a rectangle that bounds all given rectangles 
    """ 
    return reduce(lambda (ax,ay,aw,ah), (bx,by,bw,bh): (min(ax,bx), 
                 min(ay,by), 
                 max(ax+aw, bx+bw), 
                 max(ay+ah, by+bh)), rects) 

または多分

def rects_bound(rects): 
    """ Returns a rectangle that bounds all given rectangles 
    """ 
    return reduce(lambda (ax,ay,aw,ah), 
         (bx,by,bw,bh): (min(ax,bx), min(ay,by), 
             max(ax+aw, bx+bw), max(ay+ah, by+bh)), 
        rects) 

私は通常だけの種類のこのような状況では、「創造的な取得」、と私は「正しい」方法はおそらくありません知っている、私はあなたの意見では、単に興味と習慣。

+0

-1あなたのラムダ関数が間違っている(私の答えを参照)...これは、行の長さについての懸念を追い込むなど –

+0

すみません?私の質問は、機能がそれが言っていることをするかどうかではなく、「間違っている」ことは間違いありません。私の質問は、これをきれいにフォーマットする方法でした。 – noio

+0

あなたは意見を求めました。あなたは1つを持っています。可能であれば、データ構造を修正してください。正しい還元剤機能を書いてください。次に、行の長さについて心配してください。 –

答えて

2

を使用すると、長い行心配している場合は、lambdaを使用しないでください。代わりに通常の名前付き関数を使用します。

def rects_bound(rects): 
    """ Returns a rectangle that bounds all given rectangles 
    """ 
    def bounding_rect_reducer((ax, ay, aw, ah), (bx, by, bw, bh)): 
     return (min(ax,bx), 
       min(ay,by), 
       max(ax+aw, bx+bw), 
       max(ay+ah, by+bh)) 

    return reduce(bounding_rect_reducer, rects) 
2

これはプログラマと状況によって異なると思いますが、通常は短い行にするために変数を割り当てるのは嫌です。

あなたの2例を見ると、私は二番目、またはこのいずれかのために行くだろう:私は次のことを示唆している

def rects_bound(rects): 
    """ Returns a rectangle that bounds all given rectangles 
    """ 
    return reduce(
     lambda (ax,ay,aw,ah), (bx,by,bw,bh): 
     (min(ax,bx), min(ay,by), max(ax+aw, bx+bw), max(ay+ah, by+bh) 
    ), 
     rects 
    ) 
+2

変数を割り当てない理由はありますか?私は長い行のために、結果に良い名前を付けることが、コードをはるかに明白にしていることがわかりました。プラス関数のローカルはかなり安いです。 –

+0

全く理由はありません。それは、長い行を分割するのと同じように、個人的な選択です。私は通常、それが何をしているのかを記述する良い関数名を持つことを好みます(名前やコメントの上に)。 – dresende

0

def rects_bound(rects): 
    """ Returns a rectangle that bounds all given rectangles 
    """ 
    return reduce(lambda (X,Y,W,H), (x,y,w,h): (min(X,x), min(Y,y), 
               max(X+W, x+w), 
               max(Y+H, y+h)), rects) 

本当に単一の文字に各引数を減らしますスペースを節約して、この外観をきれいにするのに役立ちます。別のオプションは、ラムダ関数を別の行に(恐らくdefでさえも)定義することで、最初の引数がそれほど遠くないようにすることです。

+0

-1あなたのコードはSO横スクロールバーを表示しています。 –

+0

@JohnMachin - 良い点、それをカットする余分な行を追加しました。 –

+0

まだ醜いです。字下げは構文構造とは関係ありません。余りに長くない行にのみ基づいているように見えます。 –

4

まず、できるだけ長い行を避けてください。あなたは、変数を避けることを好む場合は、この特定の例では、

def rects_bound(rects): 
    x0 = min(x for x, y, w, h in rects) 
    y0 = min(y for x, y, w, h in rects) 
    x1 = max(x + w for x, y, w, h in rects) 
    y1 = max(y + h for x, y, w, h in rects) 
    return x0, y0, x1, y1 

としてはるかに読み出し可能に書き込むことができ、あなたも、私はまだはるかに読みやすいあなたの元のコードよりも見つける

def rects_bound(rects): 
    return (min(x for x, y, w, h in rects), 
      min(y for x, y, w, h in rects), 
      max(x + w for x, y, w, h in rects), 
      max(y + h for x, y, w, h in rects)) 

を使用することができます。

は(私はrectsが複数の反復を可能にする前提としています。)

+1

これは読みやすく、はいですが、繰り返しは4回ですか? – noio

+0

@ Nio:4回の繰り返しで何が問題になりますか? (それは価値があるので、私のバージョンは自分のマシンの2倍です)。 –

+0

@SvenMarnachあなたのバージョンでは、 'rects'引数としてジェネレータを渡すことはできません。 – Bolo

1

あなたのラムダ関数は間違っています。これを修正すると、それはさらに長くなり、冗長な計算が必要になります。代わりにDEFを使用します

def rects_bound(rects): 
    """ Returns a rectangle that bounds all given rectangles 
    """ 
    def bound_2_rects((ax, ay, aw, ah), (bx, by, bw, bh)): 
     x = min(ax, bx) 
     y = min(ay, by) 
     return x, y, max(ax+aw, bx+bw) - x, max(ay+ah, by+bh) - y 

    return reduce(bound_2_rects, rects) 
関連する問題