Возвращено False три раза вместо одного - PullRequest
0 голосов
/ 18 июня 2020
def jump_to(self, position_piece, target_position):


    middle_position = Position((position_piece.line + target_position.line)/2, 
                               (position_piece.column + target_position.column)/2)

    if position_piece not in self.cases:
        return False
    elif (target_position not in position_piece.four_position_jumps() and
        target_position in self.cases):
        return False
    elif middle_position in self.cases:
        if self.cases[position_piece] == self.cases[middle_position]:
            return False

    return True

Я создал указанную выше функцию, но понял, что вернул 3 раза False. Для меня это плохая реализация. Это хорошая реализация? Как я могу изменить этот код, чтобы сделать его более pythoni c? Мне было бы интересно узнать, как вернуть False один раз вместо трех.

Ответы [ 3 ]

4 голосов
/ 18 июня 2020

Я согласен с комментарием @ leopardxpreload в том, что множественные возвраты False не являются основной проблемой вашего кода, особенно потому, что он имеет только один True возврат. Я вижу ваш расчет middle_position в начале кода, просто чтобы игнорировать его в некоторых ситуациях, как более серьезную проблему:

def jump_to(self, position_piece, target_position):

    if position_piece not in self.cases:
        return False

    if target_position in self.cases and \
        target_position not in position_piece.four_position_jumps():
        return False

    line = (position_piece.line + target_position.line) / 2
    column = (position_piece.column + target_position.column) / 2

    middle_position = Position(line, column)

    if middle_position in self.cases:
        if self.cases[position_piece] == self.cases[middle_position]:
            return False

    return True
1 голос
/ 18 июня 2020

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

cases = ['a', 'b', 'c', 'e']
position_piece = 'w'
target_position = 'r'

def jump_to():
    check1 = not any([True if each_case == position_piece else False for each_case in cases])
    check2 = any([True if each_case == target_position else False for each_case in cases])
    return False if check1 or check2 else True

print(checker())

Примечание: поскольку вы проверяете target_position in self.cases:, компаратор and означает, что просто проверки этого достаточно, чтобы охватить случаи.

0 голосов
/ 18 июня 2020

Ваша реализация достойна, но может быть улучшена с помощью ответа @cdlane.

Этот ответ направлен на использование единой точки выхода. Хотя это может быть более читаемым, чем ответ cdlane. Это более сложный и, вероятно, менее обслуживаемый ответ, чем ответ cdlane, и вместо этого вы должны использовать его / ее ответ. Но вот как может выглядеть разовая отдача.

def jump_to(self, position_piece, target_position):
    middle_position = Position((position_piece.line + target_position.line)/2,
                                   (position_piece.column + target_position.column)/2)
    return (position_piece in self.cases
            and (not target_position in self.cases
                 or (target_position in position_piece.four_position_jumps()
                     and self.cases[position_piece] != self.cases[middle_position])))
...