格式化长python线

时间:2012-01-06 18:11:00

标签: python code-formatting

在下面的函数中缩进/格式化该行的方法是什么?或者我不应该试着把它写成一个班轮吗?

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)

在这些情况下,我通常只是“有创意”,而且我知道可能没有“正确”的方式,我只是对你的意见和习惯感兴趣。

5 个答案:

答案 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 :(得分: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 :(得分: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)

答案 3 :(得分:1)

你的lambda函数是错误的。要修复它会使它更长并涉及冗余计算。改为使用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)

答案 4 :(得分: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)

将每个参数减少为单个字符确实可以节省空间,这有助于使其看起来更干净。另一种选择是在一个单独的行上定义lambda函数(甚至可能使用def),这样参数就不会那么远了。