eof when reading a line что это

Я пытаюсь определить функцию для создания периметра прямоугольника. Вот код:

Я думаю, что я не оставил никаких аргументов открытым или что-то в этом роде.

Запуск таким образом:

Я подозреваю, что IDLE просто передает одну строку в ваш script. Первая input() — это сплошная строка. Обратите внимание, что произойдет, если вы поместите некоторые заявления печати после вызовов input() :

Запуск echo «1 2» | test.py создает

Обратите внимание, что первый оператор печати печатает всю строку ‘1 2’ . Второй вызов input() вызывает ошибку EOFError (ошибка конца файла).

Таким образом, простой канал, такой как тот, который я использовал, позволяет передавать только одну строку. Таким образом, вы можете только один раз вызвать input() . Затем вы должны обработать эту строку, разбить ее на пробелы и преобразовать фрагменты строки в ints самостоятельно. Это то, что

Исключения возникают тогда, когда в программе возникает некоторая исключительная ситуация. Например, к чему приведёт попытка чтения несуществующего файла? Или если файл был случайно удалён, пока программа работала? Такие ситуации обрабатываются при помощи исключений.

Это касается и программ, содержащих недействительные команды. В этом случае Python поднимает руки и сообщает, что обнаружил ошибку.

Ошибки¶

Рассмотрим простой вызов функции print . Что, если мы ошибочно напишем print как Print ? Обратите внимание на заглавную букву. В этом случае Python поднимает синтаксическую ошибку.

Обратите внимание, что была поднята ошибка NameError , а также указано место, где была обнаружена ошибка. Так в данном случае действует обработчик ошибок.

Исключения¶

Попытаемся считать что-либо от пользователя. Нажмите Сtrl-D (или Ctrl+Z в Windows) и посмотрите, что произойдёт.

Python поднимает ошибку с именем EOFError , что означает, что он обнаружил символ конца файла (который вводится при помощи Ctrl-D ) там, где не ожидал.

Обработка исключений¶

Обрабатывать исключения можно при помощи оператора try..except [1]. При этом все обычные команды помещаются внутрь try-блока, а все обработчики исключений – в except-блок.

Пример: (сохраните как try_except.py )

Вывод:

Как это работает:

Помните, что для каждого выражения try должно быть хотя бы одно соответствующее выражение except . Иначе какой смысл был бы в блоке try ?

Если ошибка или исключение не обработано, будет вызван обработчик Python по умолчанию, который останавливает выполнение программы и выводит на экран сообщение об ошибке. Выше мы уже видели это в действии.

Можно также добавить пункт else к соответствующему блоку try..except . Этот пункт будет выполнен тогда, когда исключений не возникает.

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

Вызов исключения¶

Исключение можно поднять при помощи оператора raise [2], передав ему имя ошибки/исключения, а также объект исключения, который нужно выбросить.

Вызываемая ошибка или исключение должна быть классом, который прямо или непрямо является производным от класса Exception .

Пример: (сохраните как raising.py )

Вывод:

Как это работает:

Здесь мы создаём наш собственный тип исключения. Этот новый тип исключения называется ShortInputException . Он содержит два поля: length , хранящее длину введённого текста, и atleast , указывающее, какую минимальную длину текста ожидала программа.

В пункте except мы указываем класс ошибки ShortInputException , который будет сохранён как[3] переменная ex , содержащая соответствующий объект ошибки/исключения. Это аналогично параметрам и аргументам при вызове функции. Внутри этого пункта except мы используем поля length и atleast объекта исключения для вывода необходимых сообщений пользователю.

Try .. Finally¶

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

Сохраните как finally.py :

Вывод:

Как это работает:

Здесь мы производим обычные операции чтения из файла, но в данном случае добавляем двухсекундный сон после вывода каждой строки при помощи функции time.sleep , чтобы программа выполнялась медленно (ведь Python очень быстр от природы). Во время выполнения программы нажмите ctrl-c , чтобы прервать/отменить выполнение программы.

Пронаблюдайте, как при этом выдаётся исключение KeyboardInterrupt , и программа выходит. Однако, прежде чем программа выйдет, выполняется пункт finally , и файловый объект будет всегда закрыт.

Оператор with¶

Типичной схемой является запрос некоторого ресурса в блоке try с последующим освобождением этого ресурса в блоке finally . Для того, чтобы сделать это более “чисто”, существует оператор with [4]:

Сохраните как using_with.py :

Как это работает:

Вывод должен быть таким же, как и в предыдущем примере. Разница лишь в том, что здесь мы используем функцию open с оператором with – этим мы оставляем автоматическое закрытие файла под ответственность with open .

За кулисами происходит следующее. Существует некий протокол, используемый оператором with . Он считывает объект, возвращаемый оператором open . Назовём его в данном случае “thefile”.

Перед запуском блока кода, содержащегося в нём, оператор with всегда вызывает функцию thefile.__enter__ , а также всегда вызывает thefile.__exit__ после завершения выполнения этого блока кода.

Так что код, который мы бы написали в блоке finally , будет автоматически обработан методом __exit__ . Это избавляет нас от необходимости повторно в явном виде указывать операторы try..finally .

Более обширное рассмотрение этой темы выходит за рамки настоящей книги, поэтому для более исчерпывающего объяснения см. PEP 343.

Резюме¶

Мы обсудили использование операторов try..except и try..finally . Мы также увидели, как создавать наши собственные типы исключений и как их вызывать.

Далее мы ознакомимся со стандартной библиотекой Python.

I am trying to define a function to make the perimeter of a rectangle. Here is the code:

I think I haven’t left any arguments opened or anything like that.

3 Answers 3

Running it like this produces:

I suspect IDLE is simply passing a single string to your script. The first input() is slurping the entire string. Notice what happens if you put some print statements in after the calls to input() :

Running echo «1 2» | test.py produces

Notice the first print statement prints the entire string ‘1 2’ . The second call to input() raises the EOFError (end-of-file error).

So a simple pipe such as the one I used only allows you to pass one string. Thus you can only call input() once. You must then process this string, split it on whitespace, and convert the string fragments to ints yourself. That is what

Оцените статью