@Maruf995
Backend Developer

Выдает ошибку None 1=, как решить?

Запустил тестирование алгоритма через Юниттест

Сам алгоритм: algorithm.py
class FurnitureArrangement():

    coordinates = []  # хранение координат по схеме "ключ объекта: (координаты, маркеры углов, маркеры точек)
    free_space = [] # хранение расстояний между мебелью через запятую (в виде координат)



    def free_space_algorithm(objects, walls_length):
            # На вход подается список с координатами углов объектов. Координаты между друг другом минусим, находим
            # по ближайшим неприлегающим углам расстояние по модулю в виде гипотенузы (вычитание по иксу -- это
            # один катет, вычитание по игрику -- другой). И записыванием самое большое расстояние в переменную. Углы
            # разбиты по сторонам света: north_west, north-east, south-west, south-east. Отдельно так же идет
            # значение и длина стены "walls_length": {"first_wall": 1, "second_wall": 2, "third_wall": 1, "fourth_wall": 2}
            lengths = {}

            def longest_distance_corner(first_left, first_right, second_left, second_right):
                first_distance = abs(first_left - second_left)
                second_distance = abs(first_left - second_right)
                third_distance = abs(first_right - second_left)
                fourth_distance = abs(first_right - second_right)

                minimal_distance = min([first_distance, second_distance, third_distance, fourth_distance])
                return minimal_distance

            def find_nearest_wall(corner, walls):
                """Функция для поиска ближайшей стены к углу"""
                nearest_wall = None
                nearest_distance = math.inf
                for i, wall in enumerate(walls):
                    dist_to_wall = distance_to_wall(corner, wall)
                    if dist_to_wall is None:
                        continue  # Угол не лежит на стене, пропускаем

                    if dist_to_wall < nearest_distance:
                        nearest_wall = i
                        nearest_distance = dist_to_wall

                return nearest_wall, nearest_distance

            def distance_to_wall(corner, wall):
                """Функция для нахождения расстояния от угла до стены"""
                x, y = corner
                x1, y1, x2, y2 = wall

                if x1 <= x <= x2 or x2 <= x <= x1:
                    return abs(y - y1)
                elif y1 <= y <= y2 or y2 <= y <= y1:
                    return abs(x - x1)
                else:
                    return None
                
            def x_or_y_distance(first_object, second_object, x_or_y):
                nearest_wall1, dist1 = find_nearest_wall(first_object["north_east"], walls)
                nearest_wall2, dist2 = find_nearest_wall(second_object["north_west"], walls)

                if nearest_wall1 is None and nearest_wall2 is None:
                    # Объекты не находятся в комнате, расстояние равно бесконечности
                    distance = math.inf
                elif nearest_wall1 == nearest_wall2:
                    # Объекты находятся на одной стене, находим расстояние между ними по x или y координате
                    distance = abs(first_object["north_east"][x_or_y] - second_object["south_west"][x_or_y])
                else:
                    # Объекты находятся на разных стенах, находим расстояние по периметру комнаты
                    distance = dist1 + dist2
                    x_distance = abs(first_object["north_east"][0] - walls[nearest_wall1][2]) + \
                                abs(second_object["south_west"][0] - walls[nearest_wall2][0]) + distance
                    y_distance = abs(first_object["north_east"][1] - walls[nearest_wall1][3]) + \
                                abs(second_object["south_west"][1] - walls[nearest_wall2][1]) + distance
                    distance = min(x_distance, y_distance)

                return distance


Сам юниттест: test_algorithm.py
import unittest
from algorithm import FurnitureArrangement


class TestFurnitureArrangement(unittest.TestCase):

    def setUp(self):
        self.calculator = FurnitureArrangement()

    def test_double_free_space_algorithm(self):
        self.assertEqual(self.calculator.free_space_algorithm(
            [{"south_east": {"x": 2, "y": 0}, "south_west": {"x": 0, "y": 0},
              "north_east": {"x": 2, "y": 3}, "north_west": {"x": 0, "y": 3},
              "wall_info": {"wall_number": 4, "wall_length": 5}},
             {"south_east": {"x": 5, "y": 0}, "south_west": {"x": 3, "y": 0},
              "north_east": {"x": 5, "y": 3}, "north_west": {"x": 3, "y": 3},
              "wall_info": {"wall_number": 4, "wall_length": 5}}]),
            ({'left_corner': {'x': 5, 'y': 3}, 'right_corner': {'x': 0, 'y': 3}}))

    def test_triple_free_space_algorithm(self):
        self.assertEqual(self.calculator.free_space_algorithm(
            [{"south_east": {"x": 6, "y": 4}, "south_west": {"x": 8, "y": 4},
              "north_east": {"x": 6, "y": 2}, "north_west": {"x": 8, "y": 2},
              "wall_info": {"wall_number": 2, "wall_length": 6}},
             {"south_east": {"x": 2, "y": 4}, "south_west": {"x": 4, "y": 4},
              "north_east": {"x": 2, "y": 2}, "north_west": {"x": 4, "y": 2},
              "wall_info": {"wall_number": 2, "wall_length": 6}},
             {"south_east": {"x": 7, "y": 6}, "south_west": {"x": 5, "y": 6},
              "north_east": {"x": 7, "y": 8}, "north_west": {"x": 5, "y": 8},
              "wall_info": {"wall_number": 4, "wall_length": 6}}]),
            ({'left_corner': {'x': 2, 'y': 2}, 'right_corner': {'x': 5, 'y': 8}}))


И сама Ошибка
self.assertEqual(self.calculator.free_space_algorithm(
AssertionError: None != {'left_corner': {'x': 2, 'y': 1}, 'right_corner': {'x': 5, 'y': 8}}
  • Вопрос задан
  • 155 просмотров
Решения вопроса 1
xenon
@xenon
Too drunk to fsck
вот тест test_triple_free_space_algorithm у вас проваливается, потому что возврат от self.calculator.free_space_algorithm(...) у вас None, а ожидается
{'left_corner': {'x': 2, 'y': 1}, 'right_corner': {'x': 5, 'y': 8}}

А None он у вас потому, что в этой функции вообще собственного кода нет (включая return), только вложенные функции. Вот по умолчанию None как return value и используется.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы