Как перевести этот код в Python, чтобы быть более читабельным? - PullRequest
0 голосов
/ 04 мая 2019

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

Я пытался таким образом.

down, up = [(+1, -1), (+1, +1)], [(-1, -1), (-1, +1)]
length = board.get_length()
piece = board.get(row, col)
if piece:
    for (x, y) in down:
        if (0 <= (row + x) < length) and (0 <= (col + y) < length) and board.is_free(row + x, col + y):
            bottom = [main.deindexify(row + x, col + y)]

    # bottom = [main.deindexify(row + x, col + y) for (x, y) in down \
    #           if (0 <= (row + x) < length)
    #           and (0 <= (col + y) < length) \
    #           and board.is_free(row + x, col + y)]

    for (x, y) in up:
        if (0 <= (row + x) < length) and (0 <= (col + y) < length) and board.is_free(row + x, col + y):
            top = [main.deindexify(row + x, col + y)]

    # top = [main.deindexify(row + x, col + y) for (x, y) in up \
    #        if (0 <= (row + x) < length) \
    #        and (0 <= (col + y) < length) \
    #        and board.is_free(row + x, col + y)]

            if piece.is_king():
        return sorted(bottom + top)
    else:
        if piece.is_black():
            return sorted(bottom)
        else:
            if is_sorted:
                return sorted(top)
            else:
                if piece.is_king():
                    return bottom + top
                else:
                    if piece.is_black():
                        return bottom
                    else:
                        return top

    # return (sorted(bottom + top) if piece.is_king() else \
    #             (sorted(bottom) if piece.is_black() else sorted(top))) \
    #     if is_sorted else (bottom + top if piece.is_king() else \
    #                            (bottom if piece.is_black() else top))
return []

И это ошибка:

line 61, in get_moves
return sorted(bottom)
UnboundLocalError: local variable 'bottom' referenced before assignment

Это оригинальная версия.

 down, up = [(+1, -1), (+1, +1)], [(-1, -1), (-1, +1)]
length = board.get_length()
piece = board.get(row, col)
if piece:
    bottom = [main.deindexify(row + x, col + y) for (x, y) in down \
              if (0 <= (row + x) < length) \
              and (0 <= (col + y) < length) \
              and board.is_free(row + x, col + y)]
    top = [main.deindexify(row + x, col + y) for (x, y) in up \
           if (0 <= (row + x) < length) \
           and (0 <= (col + y) < length) \
           and board.is_free(row + x, col + y)]
    return (sorted(bottom + top) if piece.is_king() else \
                (sorted(bottom) if piece.is_black() else sorted(top))) \
        if is_sorted else (bottom + top if piece.is_king() else \
                               (bottom if piece.is_black() else top))
return []

Может кто-нибудь объяснить мне, как читать этот код и переводить его, чтобы я мог рефакторизовать остальную часть кода?

1 Ответ

0 голосов
/ 04 мая 2019

Следующий фрагмент кода (из оригинала) создает список, если x и y удовлетворяют определенным условиям.Он записывается в виде списка.

....
    bottom = [main.deindexify(row + x, col + y) for (x, y) in down \
              if (0 <= (row + x) < length) \
              and (0 <= (col + y) < length) \
              and board.is_free(row + x, col + y)]

Один из способов развернуть понимание списка (рефакторинг) в цикл for может быть:

....
    bottom = []
    for (x,y) in down:
        x_length = (0 <= (row + x) < length)
        y_length = (0 <= (col + y) < length)
        cel_isfree = board.is_free(row + x, col + y)
        if x_length and ylength and cel_isfree:
            bottom.append(main.deindexify(row + x, col + y))

top также может быть реорганизован таким образом.

Следующий фрагмент исходного кода определяет возвращаемое значение на основе пары условий - типа piece и того, действительно лиСортировать.Он написан как вложенное условное выражение .

....
    return (sorted(bottom + top) if piece.is_king() else \
                (sorted(bottom) if piece.is_black() else sorted(top))) \
        if is_sorted else (bottom + top if piece.is_king() else \
                               (bottom if piece.is_black() else top))

Это может быть изменено следующим образом:

....
    if is_sorted:
        if piece.is_king():
            return_value = sorted(bottom + top)
        elif piece.is_black():
            return_value = sorted(bottom)
        else:
            return_value = sorted(top)
    else:
        if piece.is_king():
            return_value = bottom + top
        elif piece.is_black():
            return_value = bottom
        else:
            return_value = top
    return return_value

Конечно, у меня нетпростой способ проверить это.

...