Как бы я пошел об обработке нескольких исключений файлов? - PullRequest
1 голос
/ 03 апреля 2019

В основном мне нужно создать функцию, которая позволяет мне загружать базовые детали запланированного путешествия из файла.Вот краткое описание:

Параметры: строка, содержащая путь к файлу

Возвращает: 3 набора строк, содержащих начальное местоположение, конечное местоположение и время прибытия поездки, считанные из файла,или (Нет, Нет, Нет) в случае неудачи.

Существует несколько тестов, которые используют магические числа в качестве входных данных.Тесты заключаются в следующем:

Этот код для теста неверных данных должен дать вам пример одного из тестов:

    PATH = os.path.expanduser('~/test_prev_plan_spec.txt')

    def test_missing_file_is_handled(self):
        if os.path.exists(self.PATH):
            os.unlink(self.PATH)
        plan = utils.load_prev_plan_spec(self.PATH)
        self.assertEqual(3, len(plan))
        self.assertEqual(plan, (None, None, None))

    def test_spec_loads_ok(self):
        from_ = 'Bournemouth'
        to = 'Southampton'
        arrive_at = '2019/04/20 13:30'
        with open(self.PATH, 'wt') as f:
            f.write('{}\n{}\n{}\n'.format(from_, to, arrive_at))
        plan = utils.load_prev_plan_spec(self.PATH)
        self.assertEqual(3, len(plan))
        self.assertEqual(from_, plan[0])
        self.assertEqual(to, plan[1])
        self.assertEqual(arrive_at, plan[2])

    def test_short_spec_is_ignored(self):
        from_ = 'Bournemouth'
        to = 'Southampton'
        with open(self.PATH, 'wt') as f:
            f.write('{}\n{}\n'.format(from_, to))
        plan = utils.load_prev_plan_spec(self.PATH)
        self.assertEqual(3, len(plan))
        self.assertEqual(plan, (None, None, None))

        with open(self.PATH, 'wt') as f:
            f.write('{}\n'.format(from_))
        plan = utils.load_prev_plan_spec(self.PATH)
        self.assertEqual(3, len(plan))
        self.assertEqual(plan, (None, None, None))

    def test_empty_line_is_handled(self):
        from_ = 'Bournemouth'
        to = ''
        arrive_at = '2019/04/20 13:30'
        with open(self.PATH, 'wt') as f:
            f.write('{}\n{}\n{}\n'.format(from_, to, arrive_at))
        plan = utils.load_prev_plan_spec(self.PATH)
        self.assertEqual(3, len(plan))
        self.assertEqual(plan, (None, None, None))

    def test_bad_data_line_is_handled(self):
        from_ = 'Bournemouth'
        to = 'Southampton'
        arrive_at = '2019/04/20 13:60'
        with open(self.PATH, 'wt') as f:
            f.write('{}\n{}\n{}\n'.format(from_, to, arrive_at))
        plan = utils.load_prev_plan_spec(self.PATH)
        self.assertEqual(3, len(plan))
        self.assertEqual(plan, (None, None, None))

Это то, что у меня до сих пор, яЯ ищу помощь с этим, и любые объяснения были бы фантастическими!

Мой код атм:

def load_prev_plan_spec(PATH):
    '''
    Function: utils.load_prev_plan_specLoads the basic details of a planned journey from a file.
    Parameters: A string containing a file path
    Returns: A 3-tuple of strings containing start location, end location and arrival time of a journey
    read from the file, or (None, None, None) if unsuccessful.
    '''


    try:
        if os.path.exists(PATH):
            infomation = []
            f = open(PATH, 'r', encoding='cp1252')
            for line in f:
                infomation.append([line.strip()])
                if not line.strip():
                    infomation = (None, None, None)
            tuple(infomation)
            f.close()
            return infomation
        else:
            pass
    except IOError as err2:
        print(err2)
        raise IOError
    else:
        return infomation

1 Ответ

0 голосов
/ 04 апреля 2019

Первый неудачный тест состоит в том, что если первая или вторая строка пуста, вы привязываете кортеж с тремя None значениями к infomation, а следующая итерация затем пытается append() что-то для этого кортежа - но кортежи ненет метода append().Если вы встретите пустую строку, вам нужно прекратить обработку строк и вернуть значение ошибки.

Второй неудачный тест состоит в том, что вы пытаетесь вернуть infomation в последней строке вашей функции, но еслифайл не существует, нет пути выполнения, который присваивает значение этому имени.

Третий сбой не распознает, что 13:60 не является допустимым значением времени.

Четвертый сбой возвращает два значения вместо трех, потому что вы не проверяете, есть ли на самом деле три строки, а не меньше, в файле.

Шестой и последний сбой - потому что вы переносите каждыйпункт в списке.Почему?

Функция, передающая все контрольные примеры, может выглядеть так:

from datetime import datetime as DateTime


def load_prev_plan_spec(path):
    try:
        with open(path, 'r', encoding='cp1252') as file:
            lines = [line.strip() for line in file]
            if len(lines) == 3 and all(lines):
                try:
                    # 
                    # Just for the `ValueError` to test if string is a valid 
                    # timestamp.
                    # 
                    DateTime.strptime(lines[-1], '%Y/%m/%d %H:%M')
                except ValueError:
                    pass  # Intentionally ignored.
                else:
                    return tuple(lines)
    except (OSError, UnicodeDecodeError):
        pass  # Intentionally ignored.

    return (None, None, None)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...