Форматирование длинных строк Python - PullRequest
1 голос
/ 06 января 2012

Какой был бы красивый способ сделать отступ / отформатировать строку в функции ниже?Или я не должен пытаться написать это как один лайнер вообще?

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 ]

4 голосов
/ 06 января 2012

Прежде всего, по возможности избегайте длинных строк.Этот конкретный пример может быть написан гораздо более читабельно:

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 допускает несколько итераций.)

2 голосов
/ 06 января 2012

Если вы беспокоитесь о длинных очередях, не используйте 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 голосов
/ 06 января 2012

Я думаю, что это зависит от программиста и от ситуации, но я обычно не люблю выделять переменную только для того, чтобы иметь более короткие строки.

Глядя на ваши 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
    )
1 голос
/ 07 января 2012

Ваша лямбда-функция неверна. Чтобы исправить это, нужно сделать ее еще длиннее и потребовать избыточных вычислений. Вместо этого используйте 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)
0 голосов
/ 06 января 2012

Я бы предложил следующее:

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), чтобы в первую очередь аргументы не были такими уж большими.

...