Главная страница
Навигация по странице:

  • Вывод: $ python3 pickling.py[яблоки, манго, морковь]Как это работает

  • 15.4. Резюме 125 Исключения

  • Попытаемся

  • Пример

  • 16.3. Обработка исключений

  • 16.4. Вызов исключения 128 A Byte of Python (Russian), Версия 2.02(продолжение с предыдущей страницы)else

  • 16.5. Try .. Finally 129 A Byte of Python (Russian), Версия 2.02(продолжение с предыдущей страницы)break

  • 16.7. Резюме 131 Стандартная библиотека

  • Книга на вашем родном языке 6 2 Переводы 7 1 Доступные переводы переводы 7 3 Предисловие 16


    Скачать 0.72 Mb.
    НазваниеКнига на вашем родном языке 6 2 Переводы 7 1 Доступные переводы переводы 7 3 Предисловие 16
    Дата16.04.2023
    Размер0.72 Mb.
    Формат файлаpdf
    Имя файлаAByteofPythonRussian-2.02.pdf
    ТипКнига
    #1065836
    страница12 из 14
    1   ...   6   7   8   9   10   11   12   13   14
    любой объект Python в файле, а затем извлекать его обратно. Это называется
    длительным хранением объекта.
    Пример: (сохраните как pickling.py
    ):
    import
    pickle
    # имя файла, в котором мы сохраним объект
    shoplistfile
    =
    'shoplist.data'
    # список покупок
    shoplist
    =
    [
    'яблоки'
    ,
    'манго'
    ,
    'морковь'
    ]
    # Запись в файл
    f
    =
    open
    (shoplistfile,
    'wb'
    )
    pickle dump(shoplist, f)
    # помещаем объект в файл
    f close()
    del
    shoplist
    # уничтожаем переменную shoplist
    (продолжение на следующей странице)
    3
    pickle – англ. «мариновать», «солить» (прим.перев.)
    15.3. Pickle
    124

    A Byte of Python (Russian), Версия 2.02
    (продолжение с предыдущей страницы)
    # Считываем из хранилища
    f
    =
    open
    (shoplistfile,
    'rb'
    )
    storedlist
    =
    pickle load(f)
    # загружаем объект из файла
    print
    (storedlist)
    Вывод:
    $ python3 pickling.py
    ['яблоки', 'манго', 'морковь']
    Как это работает:
    Чтобы сохранить объект в файле, нам нужно сперва открыть файл с помощью open в режиме бинарной записи (
    'wb'
    ), после чего вызвать функцию dump из модуля pickle
    . Этот процесс называется «консервацией» («pickling»).
    После этого мы извлекаем объект при помощи функции load из модуля pickle
    , которая возвращает объект. Этот процесс называется «расконсерва- цией» («unpickling»).
    15.4 Резюме
    Мы обсудили разные типы ввода/вывода, а также работу с файлами и использование мо- дуля pickle
    Далее мы познакомимся с концепцией исключений.
    15.4. Резюме
    125

    Исключения
    Исключения возникают тогда, когда в программе возникает некоторая исключительная
    ситуация. Например, к чему приведёт попытка чтения несуществующего файла? Или ес- ли файл был случайно удалён, пока программа работала? Такие ситуации обрабатывают- ся при помощи исключений.
    Это касается и программ, содержащих недействительные команды. В этом случае Python
    поднимает руки и сообщает, что обнаружил ошибку.
    16.1 Ошибки
    Рассмотрим простой вызов функции print
    . Что, если мы ошибочно напишем print как
    Print
    ? Обратите внимание на заглавную букву. В этом случае Python поднимает синтак- сическую ошибку.
    >>>
    Print(
    'Привет, Мир!'
    )
    Traceback (most recent call last):
    File
    "
    "
    , line
    1
    , in
    Print(
    'Привет, Мир!'
    )
    NameError
    : name 'Print' is not defined
    >>>
    print
    (
    'Привет, Мир!'
    )
    Привет, Мир!
    Обратите внимание, что была поднята ошибка
    NameError
    , а также указано место, где была обнаружена ошибка. Так в данном случае действует обработчик ошибок.
    16.2 Исключения
    Попытаемся считать что-либо от пользователя. Нажмите
    Сtrl-D
    (или
    Ctrl+Z
    в Windows)
    и посмотрите, что произойдёт.
    >>>
    s
    =
    input
    (
    'Введите что-нибудь --> '
    )
    Введите что-нибудь -->
    (продолжение на следующей странице)
    126

    A Byte of Python (Russian), Версия 2.02
    (продолжение с предыдущей страницы)
    Traceback (most recent call last):
    File
    "
    "
    , line
    1
    , in
    s
    =
    input
    (
    'Введите что-нибудь --> '
    )
    EOFError
    : EOF when reading a line
    Python поднимает ошибку с именем
    EOFError
    , что означает, что он обнаружил символ
    конца файла (который вводится при помощи
    Ctrl-D
    ) там, где не ожидал.
    16.3 Обработка исключений
    Обрабатывать исключения можно при помощи оператора try..except
    1
    . При этом все обычные команды помещаются внутрь try-блока, а все обработчики исключений – в except-блок.
    Пример: (сохраните как try_except.py
    )
    try
    :
    text
    =
    input
    (
    'Введите что-нибудь --> '
    )
    except EOFError
    :
    print
    (
    'Ну зачем вы сделали мне EOF?'
    )
    except KeyboardInterrupt
    :
    print
    (
    'Вы отменили операцию.'
    )
    else
    :
    print
    (
    'Вы ввели
    {0}
    '
    format(text))
    Вывод:
    $ python3 try_except.py
    Введите что-нибудь -->
    # Нажмите ctrl-d
    Ну зачем вы сделали мне EOF?
    $ python3 try_except.py
    Введите что-нибудь -->
    # Нажмите ctrl-c
    Вы отменили операцию.
    $ python3 try_except.py
    Введите что-нибудь --> без ошибок
    Вы ввели без ошибок
    Как это работает:
    Здесь мы поместили все команды, которые могут вызвать исключе- ния/ошибки, внутрь блока try
    , а затем поместили обработчики соответству-
    1
    try – англ. «пытаться» (прим.перев.)
    16.3. Обработка исключений
    127

    A Byte of Python (Russian), Версия 2.02
    ющих ошибок/исключений в блок except
    . Выражение except может об- рабатывать как одиночную ошибку или исключение, так и список оши- бок/исключений в скобках. Если не указано имя ошибки или исключения, об- рабатываться будут все ошибки и исключения.
    Помните, что для каждого выражения try должно быть хотя бы одно соответствующее выражение except
    . Иначе какой смысл был бы в блоке try
    ?
    Если ошибка или исключение не обработано, будет вызван обработчик Python по умол- чанию, который останавливает выполнение программы и выводит на экран сообщение об ошибке. Выше мы уже видели это в действии.
    Можно также добавить пункт else к соответствующему блоку try..except
    . Этот пункт будет выполнен тогда, когда исключений не возникает.
    В следующем примере мы увидим, как можно получить объект исключения для дальней- шей работы с ним.
    16.4 Вызов исключения
    Исключение можно поднять при помощи оператора raise
    2
    , передав ему имя ошиб- ки/исключения, а также объект исключения, который нужно выбросить.
    Вызываемая ошибка или исключение должна быть классом, который прямо или непрямо является производным от класса
    Exception
    Пример: (сохраните как raising.py
    )
    class
    ShortInputException
    (
    Exception
    ):
    '''Пользовательский класс исключения.'''
    def
    __init__
    (
    self
    , length, atleast):
    Exception
    __init__
    (
    self
    )
    self length
    =
    length self atleast
    =
    atleast
    try
    :
    text
    =
    input
    (
    'Введите что-нибудь --> '
    )
    if len
    (text)
    <
    3
    :
    raise
    ShortInputException(
    len
    (text),
    3
    )
    # Здесь может происходить обычная работа
    except EOFError
    :
    print
    (
    'Ну зачем вы сделали мне EOF?'
    )
    except
    ShortInputException
    as
    ex:
    print
    (
    'ShortInputException: Длина введённой строки --
    {0}
    ;
    \
    ожидалось, как минимум,
    {1}
    '
    format(ex length, ex atleast))
    (продолжение на следующей странице)
    2
    raise – англ. «поднимать» (прим.перев.)
    16.4. Вызов исключения
    128

    A Byte of Python (Russian), Версия 2.02
    (продолжение с предыдущей страницы)
    else
    :
    print
    (
    'Не было исключений.'
    )
    Вывод:
    $ python3 raising.py
    Введите что-нибудь --> а
    ShortInputException: Длина введённой строки -- 1; ожидалось, как минимум, 3
    $ python3 raising.py
    Введите что-нибудь --> абв
    Не было исключений.
    Как это работает:
    Здесь мы создаём наш собственный тип исключения. Этот новый тип исклю- чения называется
    ShortInputException
    . Он содержит два поля:
    length
    , хра- нящее длину введённого текста, и atleast
    , указывающее, какую минималь- ную длину текста ожидала программа.
    В пункте except мы указываем класс ошибки
    ShortInputException
    , кото- рый будет сохранён как
    3
    переменная ex
    , содержащая соответствующий объ- ект ошибки/исключения. Это аналогично параметрам и аргументам при вы- зове функции. Внутри этого пункта except мы используем поля length и
    atleast объекта исключения для вывода необходимых сообщений пользова- телю.
    16.5 Try .. Finally
    Представим, что в программе происходит чтение файла и необходимо убедиться, что объ- ект файла был корректно закрыт и что не возникло никакого исключения. Этого можно достичь с применением блока finally
    Сохраните как finally.py
    :
    import
    time
    try
    :
    f
    =
    open
    (
    'poem.txt'
    )
    while True
    :
    # наш обычный способ читать файлы
    line
    =
    f readline()
    if len
    (line)
    ==
    0
    :
    (продолжение на следующей странице)
    3
    as – англ. «как» (прим.перев.)
    16.5. Try .. Finally
    129

    A Byte of Python (Russian), Версия 2.02
    (продолжение с предыдущей страницы)
    break
    print
    (line, end
    =
    ''
    )
    time sleep(
    2
    )
    # Пусть подождёт некоторое время
    except KeyboardInterrupt
    :
    print
    (
    '!! Вы отменили чтение файла.'
    )
    finally
    :
    f close()
    print
    (
    '(Очистка: Закрытие файла)'
    )
    Вывод:
    $ python3 finally.py
    Программировать весело
    Если работа скучна,
    Чтобы придать ей весёлый тон -
    !! Вы отменили чтение файла.
    (Очистка: Закрытие файла)
    Как это работает:
    Здесь мы производим обычные операции чтения из файла, но в данном слу- чае добавляем двухсекундный сон после вывода каждой строки при помощи функции time.sleep
    , чтобы программа выполнялась медленно (ведь Python очень быстр от природы). Во время выполнения программы нажмите ctrl-c
    ,
    чтобы прервать/отменить выполнение программы.
    Пронаблюдайте, как при этом выдаётся исключение
    KeyboardInterrupt
    , и программа выходит. Однако, прежде чем программа выйдет, выполняется пункт finally
    , и файловый объект будет всегда закрыт.
    16.6 Оператор with
    Типичной схемой является запрос некоторого ресурса в блоке try с последующим осво- бождением этого ресурса в блоке finally
    . Для того, чтобы сделать это более «чисто»,
    существует оператор with
    4
    :
    Сохраните как using_with.py
    :
    with open
    (
    "poem.txt"
    )
    as
    f:
    for
    line
    in
    f:
    print
    (line, end
    =
    ''
    )
    4
    with – англ. «с» (прим.перев.)
    16.6. Оператор with
    130

    A Byte of Python (Russian), Версия 2.02
    Как это работает:
    Вывод должен быть таким же, как и в предыдущем примере. Разница лишь в том, что здесь мы используем функцию open с оператором with
    – этим мы оставляем автоматическое закрытие файла под ответственность with open
    За кулисами происходит следующее. Существует некий протокол, используе- мый оператором with
    . Он считывает объект, возвращаемый оператором open
    Назовём его в данном случае «thefile».
    Перед запуском блока кода, содержащегося в нём, оператор with
    всегда вы- зывает функцию thefile.__enter__
    , а также всегда вызывает thefile.
    __exit__
    после завершения выполнения этого блока кода.
    Так что код, который мы бы написали в блоке finally
    , будет автоматически обработан методом
    __exit__
    . Это избавляет нас от необходимости повторно в явном виде указывать операторы try..finally
    Более обширное рассмотрение этой темы выходит за рамки настоящей книги,
    поэтому для более исчерпывающего объяснения см.
    PEP 343
    16.7 Резюме
    Мы обсудили использование операторов try..except и
    try..finally
    . Мы также уви- дели, как создавать наши собственные типы исключений и как их вызывать.
    Далее мы ознакомимся со стандартной библиотекой Python.
    16.7. Резюме
    131

    Стандартная библиотека
    Стандартная библиотека Python содержит огромное количество полезных модулей и яв- ляется частью стандартного комплекта поставки Python. Ознакомиться со стандартной библиотекой Python очень важно, так как множество задач можно решить очень быстро,
    если вы знакомы с возможностями этих библиотек.
    Рассмотрим некоторые наиболее часто используемые модули этой библиотеки. Деталь- ное описание всех модулей стандартной библиотеки Python можно найти в разделе
    «Library Reference»
    документации, входящей в комплект поставки Python.
    Давайте изучим несколько полезных модулей.
    Примечание
    Если темы в настоящей главе покажутся вам слишком сложными, вы можете её пропу- стить. Однако я настоятельно рекомендую вернуться к этой главе, когда вы будете чув- ствовать себя более уверенно с Python.
    17.1 Модуль sys
    Модуль sys содержит функциональность, характерную для системы. Так мы видели, что список sys.argv содержит аргументы командной строки.
    Предположим, нам нужно узнать версию используемой команды Python с тем, чтобы, к примеру, убедиться в том, что мы используем как минимум версию 3. Модуль sys предо- ставляет такую возможность.
    >>>
    import
    sys
    >>>
    sys version_info
    (3, 0, 0, 'beta', 2)
    >>>
    sys version_info[
    0
    ]
    >=
    3
    True
    132

    A Byte of Python (Russian), Версия 2.02
    Как это работает:
    Модуль sys содержит кортеж version_info
    , который хранит информацию о версии. Первый элемент этого кортежа обозначает старшую версию. Мы мо- жем использовать его, например, для того, чтобы убедиться, что программа будет выполняться только в Python 3.0:
    Сохраните как versioncheck.py
    :
    import
    sys
    ,
    warnings
    if
    sys version_info[
    0
    ]
    <
    3
    :
    warnings warn(
    "Для выполнения этой программы необходима как минимум
    \
    версия Python 3.0"
    ,
    RuntimeWarning
    )
    else
    :
    print
    (
    'Нормальное продолжение'
    )
    Вывод:
    $ python2.7 versioncheck.py versioncheck.py:6: Для выполнения этой программы необходима как минимум

    ,

    версия Python 3.0
    RuntimeWarning)
    $ python3 versioncheck.py
    Нормальное продолжение
    Как это работает:
    Мы используем один из модулей стандартной библиотеки, который называ- ется warnings и служит для отображения предупреждений пользователю. Ес- ли версия Python менее 3, мы показываем соответствующее предупреждение.
    17.2 Модуль logging
    Представьте ситуацию, когда необходимо сохранить некоторые отладочные или другие важные сообщения где-нибудь, чтобы иметь возможность позже проверить, отработала ли программа, как ожидалось. Как мы «сохраним где-нибудь» эти сообщения? Сделать это можно при помощи модуля logging
    Сохраните как use_logging.py
    :
    import
    os
    ,
    platform
    ,
    logging
    if
    platform platform()
    startswith(
    'Windows'
    ):
    logging_file
    =
    os path join(os getenv(
    'HOMEDRIVE'
    ), \
    (продолжение на следующей странице)
    17.2. Модуль logging
    133

    A Byte of Python (Russian), Версия 2.02
    (продолжение с предыдущей страницы)
    os getenv(
    'HOMEPATH'
    ), \
    'test.log'
    )
    else
    :
    logging_file
    =
    os path join(os getenv(
    'HOME'
    ),
    'test.log'
    )
    print
    (
    "Сохраняем лог в"
    , logging_file)
    logging basicConfig(
    level
    =
    logging
    DEBUG,
    format
    =
    '
    %(asctime)s
    :
    %(levelname)s
    :
    %(message)s
    '
    ,
    filename
    =
    logging_file,
    filemode
    =
    'w'
    ,
    )
    logging debug(
    "Начало программы"
    )
    logging info(
    "Какие-то действия"
    )
    logging warning(
    "Программа умирает"
    )
    Вывод:
    $ python3 use_logging.py
    Сохраняем лог в C:\Users\swaroop\test.log
    Если открыть файл test.log
    , он будет выглядеть примерно так:
    2012
    -
    10
    -
    26 16
    :
    52
    :
    41
    ,
    457
    : DEBUG : Начало программы
    2012
    -
    10
    -
    26 16
    :
    52
    :
    41
    ,
    474
    : INFO : Какие
    - то действия
    2012
    -
    10
    -
    26 16
    :
    52
    :
    41
    ,
    475
    : WARNING : Программа умирает
    Как это работает:
    Мы использовали три модуля из стандартной библиотеки: модуль os для вза- имодействия с операционной системой, модуль platform для получения ин- формации о платформе (т.е. операционной системе) и модуль logging для сохранения лога
    1
    Прежде всего, при помощи строки, возвращаемой функцией platform.
    platform()
    мы проверяем, какая операционная система используется (для более подробной информации см.
    import platform; help(platform)
    ). Ес- ли это Windows, то мы определяем диск, содержащий домашний каталог, путь к домашнему каталогу на нём и имя файла, в котором хотим сохранить ин- формацию. Сложив все эти три части, мы получаем полный путь к файлу.
    Для других платформ нам нужно знать только путь к домашнему каталогу пользователя, и мы получим полный путь к файлу.
    1
    log – англ. «журнал», «вести журнал» (прим.перев.)
    17.2. Модуль logging
    134

    A Byte of Python (Russian), Версия 2.02
    При помощи функции os.path.join()
    мы объединяем три части пути к файлу вместе. Мы используем эту функцию вместо простого объединения строк для того, чтобы гарантировать, что полный путь к файлу записан в фор- мате, ожидаемом операционной системой.
    Далее мы конфигурируем модуль logging таким образом, чтобы он записы- вал все сообщения в определённом формате в указанный файл.
    Наконец, мы можем выводить сообщения, предназначенные для отладки, ин- формирования, предупреждения и даже критические сообщения. После вы- полнения программы можно просмотреть этот файл и узнать, что происхо- дило в программе, хотя пользователю, запустившему программу, ничего не было показано.
    17.3 Серия «Модуль недели»
    В стандартной библиотеке можно найти ещё много полезного. Например,
    отладка
    ,
    обра- ботка параметров командной строки
    ,
    регулярные выражения и так далее.
    Лучший способ дальнейшего изучения стандартной библиотеки – читать замечательную серию Дуга Хелмана
    «Модуль недели»
    или официальную документацию Python
    17.4 Резюме
    Мы изучили лишь некоторые возможности некоторых модулей стандартной библиотеки
    Python. Я настоятельно рекомендую просмотреть документацию по стандартной библио- теке Python
    , чтобы увидеть все доступные модули.
    Далее мы обратимся к некоторым аспектам, которые сделают вашу экскурсию по Python более «завершённой».
    1   ...   6   7   8   9   10   11   12   13   14


    написать администратору сайта