Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Отлов ошибок импорта. Несвязанные переменные. Всё чувствительно к регистру. Запуск скриптов




Отлов ошибок импорта

Одно из встроенных исключений Python — ImportError (ошибка импорта), которое вызывается, если не удаётся импортировать модуль. Это может случиться по нескольким причинам, самая простая из которых — отсутствие модуля в пути поиска, оператора import. Что можно использовать для включения в программу опциональных возможностей. Например, библиотека chardet предоставляет возможность автоматического определения кодировки символов. Предположим, ваша программа хочет использовать эту библиотеку в том случае, если она есть, или спокойно продолжить работу, если пользователь не установил её. Можно сделать это с помощью блока try... except.

try: import chardet except ImportError: chardet = None

После этого можно проверять наличие модуля chardet простым if:

if chardet:
# что-то сделать
else:
# продолжить дальше

Другое частое применение исключения ImportError — выбор из двух модулей, предоставляющих одинаковый интерфейс (API), причём применение одного из них предпочтительнее другого (может, он быстрее работает или требует меньше памяти). Для этого можно попытаться импортировать сначала один модуль, и если это не удалось, то импортировать другой. К примеру, в главе XML рассказывается о двух модулях, реализующих один и тот же API, так называемый ElementTree API. Первый — lxml — сторонний модуль, который необходимо скачивать и устанавливать самостоятельно. Второй — xml. etree. ElementTree — медленнее, но входит в стандартную библиотеку Python 3.

try:
from lxml import etree
except ImportError:
import xml. etree. ElementTree as etree

При выполнении этого блока try... except будет импортирован один из двух модулей под именем etree. Поскольку оба модуля реализуют один и тот же API, то в последующем коде нет необходимости проверять, какой из этих модулей был импортирован. И раз импортированный модуль в любом случае именуется как etree, то не придётся вставлять лишние if для обращения к разноимённым модулям.

Несвязанные переменные

Взглянем ещё раз на вот эту строчку функции approximate_size():

multiple = 1024 if a_kilobyte_is_1024_bytes else 1000

Мы нигде не объявляли переменную multiple (множитель), мы только присвоили ей значение. Всё в порядке, Python позволяет так делать. Что он не позволит сделать, так это обратиться к переменной, которой не было присвоено значение. Если попытаться так сделать, возникнет исключение NameError (ошибка в имени).

> > > x
Traceback (most recent call last):
File " < stdin> ", line 1, in < module>
NameError: name 'x' is not defined
> > > x = 1
> > > x
1

Перевод сообщения оболочки:

Раскрутка стека (список последних вызовов):

Файл " < stdin> ", строка 1, < модуль>

NameError: имя 'x' не определено

Однажды вы скажете Python «спасибо» за это.

Всё чувствительно к регистру

Все имена в Python чувствительны к регистру — имена переменных, функций, классов, модулей, исключений. Всё, что можно прочитать, записать, вызвать, создать или импортировать, чувствительно к регистру.

> > > an_integer = 1
> > > an_integer
1
> > > AN_INTEGER
Traceback (most recent call last):
File " < stdin> ", line 1, in < module>
NameError: name 'AN_INTEGER' is not defined
> > > An_Integer
Traceback (most recent call last):
File " < stdin> ", line 1, in < module>
NameError: name 'An_Integer' is not defined
> > > an_inteGer
Traceback (most recent call last):
File " < stdin> ", line 1, in < module>
NameError: name 'an_inteGer' is not defined

Перевод сообщений оболочки:

Раскрутка стека (список последних вызовов):

Файл " < stdin> ", строка 1, < модуль>

NameError: имя '< имя> ' не определено

И так далее.

Запуск скриптов

В Python всё является объектом.

Модули Python — это объекты, имеющие несколько полезных атрибутов. И это обстоятельство можно использовать для простого тестирования модулей, при их написании, путём включения особого блока кода, который будет исполняться при запуске файла из командной строки. Взгляните на последние строки humansize. py:

if __name__ == '__main__':
print(approximate_size(1000000000000, False))
print(approximate_size(1000000000000))

Как и в C, в Python используется оператор == для проверки на равенство и оператор = для присваивания. Но в отличие от C, Python не поддерживает присваивание внутри другого выражения, поэтому у вас не получится случайно присвоить значение вместо проверки на равность.

Итак, что же делает этот блок if особенным? У всех модулей, как у объектов, есть встроенный атрибут __name__ (имя). И значение этого атрибута зависит от того, как модуль используется. Если модуль импортируется, то __name__ принимает значение равное имени файла модуля, без расширения и пути к каталогу.

> > > import humansize
> > > humansize. __name__
'humansize'

Но модуль можно запустить и напрямую, как самостоятельную программу, в этом случае __name__ примет особое значение — __main__. Python вычислит значение условного выражения в операторе if, определит его истинность, и выполнит блок кода if. В данном случае, будут напечатаны два значения.

c: \home\diveintopython3> c: \python31\python. exe humansize. py
1. 0 TB
931. 3 GiB

И это ваша первая программа на Python!

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...