| Повторное использование программного кода с помощью инструкции import |
|
Одна из проблем с освоением чего-либо нового состоит в том, что если это новое достаточно абстрактная вещь, бывает очень сложно найти ей применение. Когда в последний раз вам приходилось применять знание математики, полученное в средней школе, в продуктовом магазине? В предыдущих примерах было показано, как создавать функции, которые представляют альтернативу простому последовательному выполнению команд оболочки. Мы также сообщили, что модуль - это обычный сценарий или некоторое количество строк программного кода в файле. В этом подходе нет ничего сложного, но программный код должен быть организован определенным способом, чтобы его можно было повторно использовать в будущих программах. В этом разделе мы покажем вам, почему это так важно. Давайте импортируем оба предыдущих сценария сбора информации о системе и выполним их. Откройте окна с IPython и Bash, если вы закрыли их, чтобы мы могли быстро продемонстрировать, почему функции играют такую важную роль с точки зрения повторного использования программного кода. Один из наших первых сценариев на языке Python представлял собой простую последовательность команд в файле с именем pysysinfo.py. В языке Python файл является модулем и наоборот, поэтому мы можем импортировать этот файл сценария в оболочку IPython. Обратите внимание, вы никогда не должны указывать расширение .ру файла в инструкции импорта. Фактически попытка импорта окончится неудачей, если расширение будет указано. Итак, мы выполнили импорт сценария на ноутбуке Hoa Macbook Pro:
Ух ты! Выглядит круто, правда? Когда импортируется файл, содержащий программный код на языке Python, он тут же выполняется. Но в действительности за всем этим кроется несколько проблем. Если вы планируете запускать такой программный код на языке Python, его всегда придется запускать из командной строки как часть сценария или программы, которую вы пишете. Операция импорта должна помочь в воплощении идеи «повторного использования программного кода». Но вот что интересно: как быть, если нам потребуется получить только информацию о распределении дискового пространства? В данном сценарии это невозможно. Именно для этого используются функции. Они позволяют контролировать, когда и какие части программы должны выполняться, чтобы она не выполнялась целиком, как в примере выше. Если импортировать сценарий, где эти команды оформлены в виде функций, можно увидеть, что мы имеем в виду. Ниже приводится результат импортирования сценария в терминале IPython:
Этот результат ничем не отличается от того, что был получен при использовании сценария без функций. Если вы озадачены, - это хороший знак. Чтобы понять, почему был получен тот же самый результат, дос- таточно заглянуть в исходный программный код. Откройте сценарий pysysinfo_func.py в другой вкладке или в другом окне терминала и найдите строки:
Проблема в том, что функция main, созданная нами в конце предыдущего раздела, обернулась для нас некоторой неприятностью. С одной стороны, хотелось бы иметь возможность запускать сценарий из командной строки, чтобы получать полную информацию о системе, но с другой стороны, нам совсем не нужно, чтобы модуль выводил что-либо при импортировании. К счастью, потребность использовать модули как в виде сценариев, выполняемых из командной строки, так и в виде повторно используемых модулей достаточно часто встречается в языке Python. Решение этой проблемы состоит в том, чтобы определить, когда следует вызывать главную функцию, изменив последнюю часть сценария, как показано ниже:
Эта «идиома» представляет прием, который обычно используется для решения данной проблемы. Любой программный код, входящий в состав блока этой условной инструкции, будет выполняться, только когда модуль запускается из командной строки. Чтобы убедиться в этом, измените окончание своего сценария или импортируйте исправленную его версию pysysinfo_func_2.py. Если теперь вернуться к оболочке IPython и импортировать новый сценарий, вы должны увидеть следующее:
На этот раз благодаря нашим исправлениям функция main вызвана не была. Итак, вернемся вновь к теме повторного использования программного кода: у нас имеется три функции, которые можно использо-' вать в других программах или вызывать в интерактивной оболочке IPython. Вспомните: ранее мы говорили, что было бы неплохо иметь возможность вызвать только функцию, которая выводит информацию о распределении дискового пространства. Сначала необходимо вновь вернуться к одной из возможностей оболочки IPython, которую мы уже демонстрировали ранее. Вспомните, как мы использовали клавишу Tab для получения полного списка атрибутов модуля, доступных для использования. Ниже показано, как выглядит этот список для нашего модуля:
В этом примере пока можно проигнорировать все имена, содержащие двойные символы подчеркивания, потому что они представляют специальные методы, описание которых выходит далеко за рамки этого введения. Поскольку IPython - это обычная командная оболочка, она обнаружила файл с расширением .рус, содержащий скомпилированный байт-код Python. Отбросив все эти ненужные имена, можно заметить в списке имя pysysinfo_f unc_2.disk_f unc. Попробуем вызвать ее:
К настоящему моменту вы вероятно уже заметили, что функция «вызывается », или запускается, за счет указания круглых скобок «()» после ее имени. В данном случае мы использовали одну функцию из файла, содержащего три функции: disk_func, uname_func и, наконец, main. Ага! Мы все-таки сумели найти способ повторного использования нашего программного кода. Мы импортировали модуль, написанный нами ранее, и в интерактивной оболочке выполнили только ту его часть, которая была необходима. Безусловно, мы точно так же можем запустить и две другие функции. Давайте посмотрим на это:
Если вы были внимательны, вы должны были заметить, что были вызваны обе оставшиеся функции. Не забывайте, что функция main запускает две другие функции. Часто требуется взять из модуля только часть его программного кода и повторно использовать его в другом сценарии. Поэтому попробуем написать еще один сценарий, который использует только одну из функций. Пример такого сценария приводится в примере 1.6. Пример 1.6. Повторное использование программного кода посредством импортирования: new_pysysinfo
В этом примере мы не только повторно использовали программный код, написанный ранее, но и использовали специальную синтаксическую конструкцию, которая позволяет импортировать только необходимые функции. Вся прелесть повторного использования программного кода состоит в том, что мы можем создавать совершенно новые программы, просто импортируя функции из других программ. Обратите внимание, что в функции main вызывается функция disk_f ипс() из другого модуля, созданного нами, и новая, только что созданная, функция tmp_space() из этого файла. В этом разделе мы узнали, насколько богатой может быть возможность повторного использования программного кода, и насколько просто ее использовать. В двух словах: вы помещаете одну-две функции в файл и затем, если вам требуется иметь возможность запускать сценарий из командной строки, используете специальную синтаксическую конструкцию if__name__== "__main__":. После этого можно либо импортировать эти функции в оболочке IPython, либо просто использовать их в другом сценарии. Обладая этой информацией, вы становитесь по-настоящему опасными. Теперь вы можете создавать на языке Python довольно сложные модули и использовать их снова и снова при создании новых инструментов.
Related Articles
Set as favorite
Bookmark
Email This
Hits: 216 Комментарии (0)RSS feed CommentsНаписать комментарий |