Что такое модуль в python
Перейти к содержимому

Что такое модуль в python

  • автор:

Модули

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

Всё, что устанавливается с помощью pip, представляет собой модули. Модули иерархические: ты можешь импортировать модуль markdown и пользоваться им, не зная, что внутри он импортирует ещё десяток других модулей: Питон сам всё разрулит.

Как этим пользоваться

Имя модуля совпадает с именем файла и должно быть нормальным именем переменной в Питоне: например, не содержать знаков минуса.

Предположим, что есть папка 3_bars , в ней файл data_loaders.py с таким содержанием:

import csv import json def load_from_json(filepath): with open(filepath, 'r') as file_handler: return json.load(file_handler) def load_from_csv(filepath): with open(filepath, 'r') as file_handler: return list(csv.reader(file_handler)) 

А рядом есть файл bars.py , в котором мы хотим загрузить данные из csv. Вот что в нём можно написать:

from data_loaders import load_from_csv # импортируем функцию из модуля print(load_from_csv('bars.csv')) А можно так: ```python import data_loaders # импортируем модуль целиком print(data_loaders.load_from_csv('bars.csv')) # используем функцию с указанием модуля 

Есть ещё вариант from data_loaders import * , но он вне закона. Забудьте о нём.

Запуск модуля как скрипта

Когда Питон видит import data_loaders , он находит файл data_loaders.py и выполняет его. Реально выполняет: если в нём есть код, он будет выполнен. Даже если это не просто объявления функций, а их вызов. Представим, что когда мы писали код в data_loaders.py , мы его дебажили. Например, так:

import json def load_from_json(filepath): with open(filepath, 'r') as file_handler: return json.load(file_handler) print(load_from_json('test.json')) 

Теперь если мы импортируем этот модуль ( import data_loaders ), девятая строка выполнится, файл загрузится и выведется на экран. А ведь в bars.py это не нужно! Можно этот код удалить, но тогда будет неудобно дорабатывать функцию load_from_json : при изменении надо будет добавлять отладочный принт, а потом удалять.

Вот правильный способ это обойти:

import json def load_from_json(filepath): with open(filepath, 'r') as file_handler: return json.load(file_handler) if __name__ == '__main__': print(load_from_json('test.json')) 

Иф на девятой строке значит “выполняй меня только если файл запущен напрямую, а не импортирован”. Теперь при запуске python data_loaders.py будет выполняться дебажная загрузка кода, а при импорте этого модуля – не будет. То, что надо.

__name__ – одна из переменных магических переменных. Их можно узнать по двойным подчёркиваниям по краям. Такие переменные доступны всегда и Питон запишет нужные значения в них за нас. В __name__ хранится название модуля, из которого был импортирован данный модуль. Если модуль выполняется напрямую, Питон запишет в эту переменную значение __main__ (доки). Хитро, а?

Подводные камни

Главный подводный камень – рекурсивный импорт. Это если мы импортируем data_loaders из bars , а для data_loaders нужен bars . Вот так:

# bars.py import data_loaders # data_loaders.py import bars 

Бах! Всё сломается при запуске.

Иногда бывает ещё веселее: когда импорты замыкаются в трёх и более файлах. Типа того:

# bars.py import data_loaders # data_loaders.py import helpers # helpers.py import bars 

Всё сломается так же, как в примере выше, но ещё и заставит поломать голову при починке.

Чинить такие случаи просто: разбивать код на максимально независимые модули. В примере выше, например, файлу helpers.py зачем-то нужен bars.py . Так быть не должно: в helpers.py должны жить максимально независимые общие функции, которые используются в других файлах. Не наоборот.

Как работает под капотом

Важнее всего знать, как Питон выбирает файлы для импорта. Сначала он ищет подходящие файлы в рабочей директории, рядом с bars.py . Если не находит, то проходит по папкам в sys.path и ищет нужный файл.

Иногда бывает так, что нужный модуль находится вне тех папок, которые обходит Питон. Один из вариантов побороть это – вручную добавить нужный путь в sys.path (это список). Но это на крайний случай, обычно есть более красивые способы. Например, упаковать код в модуль и установить его с помощью pip. Так что тсс, я вам ничего не говорил.

В памяти все загруженные модули хранятся в sys.modules . Иногда встречаются случаи, когда файла нет, а модуль есть. Это не сложно устроить:

# mod.py import sys from types import ModuleType dynamic_module = ModuleType(__name__) dynamic_module.x = 5 sys.modules['some_weird_module'] = dynamic_module # script.py import mod # тут выполнился код из mod.py import some_weird_module # модуль есть, а файла – нет print(some_weird_module.x) # 5 

Делать так незаконно: это неочевидно, затрудняет отладку и вредит читаемости. Не надо так.

Попробуйте бесплатные уроки по Python

Получите крутое код-ревью от практикующих программистов с разбором ошибок и рекомендациями, на что обратить внимание — бесплатно.

Переходите на страницу учебных модулей «Девмана» и выбирайте тему.

Модули

Встроенные в язык программирования функции доступны сразу. Чтобы их вызвать, не надо выполнять никаких дополнительных действий. Однако за время существования любого популярного языка на нем было написано столько функций и классов, которые оказались востребованными множеством программистов и в разных областях, что включить весь этот объем кода в сам язык если возможно, то нецелесообразно.

Чтобы разрешить проблему доступа к дополнительным возможностям языка, в программировании стало общепринятой практикой использовать так называемые модули, пакеты и библиотеки. Каждый модуль содержит коллекцию функций и классов, предназначенных для решения задач из определенной области. Так в модуле math языка Python содержатся математические функции, модуль random позволяет генерировать псевдослучайные числа, в модуле datetime содержатся классы для работы с датами и временем, модуль sys предоставляет доступ к системным переменным и т. д.

Количество модулей для языка Python огромно, что связано с популярностью языка. Часть модулей собрана в так называемую стандартную библиотеку. Стандартная она потому, что поставляется вместе с установочным пакетом. Однако существуют сторонние библиотеки. Они скачиваются и устанавливаются отдельно.

Для доступа к функционалу модуля, его надо импортировать в программу. После импорта интерпретатор «знает» о существовании дополнительных классов и функций и позволяет ими пользоваться.

В Питоне импорт осуществляется командой import . При этом существует несколько способов импорта. Рассмотрим работу с модулем на примере math . Итак,

>>> import math

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

>>> math

В программе завелся объект math , относящийся к классу module .

Чтобы увидеть перечень функций, входящих в этот модуль, воспользуемся встроенной в Python функцией dir() , передав ей в качестве аргумента имя модуля:

>>> dir(math) ['__doc__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'comb', 'copysign', 'cos', 'cosh', 'degrees', 'dist', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'isqrt', 'lcm', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'nextafter', 'perm', 'pi', 'pow', 'prod', 'radians', 'remainder', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'tau', 'trunc', 'ulp']

Проигнорируем имена с двойными подчеркиваниями. Все остальное – имена функций и констант (переменных, которые не меняют своих значений), включенных в модуль math. Чтобы вызвать функцию из модуля, надо впереди написать имя модуля, поставить точку, далее указать имя функции, после чего в скобках передать аргументы, если они требуются. Например, чтобы вызвать функцию pow из math, надо написать так:

>>> math.pow(2, 2) 4.0

Обратите внимание, эта другая функция pow() , не та, что встроена в сам язык. «Обычная» функция pow() возвращает целое, если аргументы целые числа:

>>> pow(2, 2) 4

Для обращения к константе скобки не нужны:

>>> math.pi 3.141592653589793

Если мы не знаем, что делает та или иная функция, то можем получить справочную информацию о ней с помощью встроенной в язык Python функции help() :

>>> help(math.gcd) Help on built-in function gcd in module math: gcd(*integers) Greatest Common Divisor. (END)

Для выхода из интерактивной справки надо нажать клавишу q . В данном случае сообщается, что функция вычисляет наибольший общий делитель. Описание модулей и их содержания также можно посмотреть в официальной документации на сайте python.org.

Второй способ импорта – это когда импортируется не сам модуль, а только необходимые функции из него.

>>> from math import gcd, sqrt, hypot

Перевести можно как «из модуля math импортировать функции gcd , sqrt и hypot «.

В таком случае при их вызове не надо перед именем функции указывать имя модуля:

>>> gcd(100, 150) 50 >>> sqrt(16) 4.0 >>> hypot(3, 4) 5.0

Чтобы импортировать сразу все функции из модуля:

>>> from math import *

Импорт через from не лишен недостатка. В программе уже может быть идентификатор с таким же именем, как имя одной из импортируемых функций или констант. Ошибки не будет, но одно из них окажется «затерто»:

>>> pi = 3.14 >>> from math import pi >>> pi 3.141592653589793

Здесь исчезает значение 3.14, присвоенное переменной pi . Это имя теперь указывает на число из модуля math . Если импорт сделать раньше, чем присвоение значения pi , то будет все наоборот:

>>> from math import pi >>> pi = 3.14 >>> pi 3.14

В этой связи более опасен именно импорт всех функций. Так как в этом случае очень легко не заметить подмены значений идентификаторов.

Однако можно изменить имя идентификатора из модуля на какое угодно:

>>> from math import pi as P >>> P 3.141592653589793 >>> pi 3.14

В данном случае константа pi из модуля импортируется под именем P . Другой смысл подобных импортов – сокращение имен, так как есть модули с длинными именами, а имена функций и классов в них еще длиннее. Если в программу импортируется всего пара сущностей, и они используются в ней часто, то имеет смысл переименовать их на более короткий вариант. Сравните:

>>> import calendar >>> calendar.weekheader(2) 'Mo Tu We Th Fr Sa Su'
>>> from calendar import weekheader as week >>> week(3) 'Mon Tue Wed Thu Fri Sat Sun'

Во всех остальных случаях лучше оставлять идентификаторы содержимого модуля в пространстве имен самого модуля и получать доступ к ним через имя модуля, то есть выполнять импорт командой import имя_модуля , а вызывать, например, функции через имя_модуля.имя_функции() .

Практическая работа. Создание собственного модуля

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

from math import pi, pow def rectangle(a, b): return round(a * b, 2) def triangle(a, h): return round(0.5 * a * h, 2) def circle(r): return round(pi * pow(r, 2), 2) 

Здесь также иллюстрируется принцип, что один модуль может импортировать другие. В данном случае импортируются функции из модуля math .

Поместите данный код в отдельный файл square.py . Однако куда поместить сам файл?

Когда интерпретатор Питона встречает команду импорта, то просматривает на наличие файла-модуля определенные каталоги. Их перечень можно увидеть по содержимому sys.path :

>>> import sys >>> sys.path ['', '/usr/lib/python310.zip', '/usr/lib/python3.10', '/usr/lib/python3.10/lib-dynload', '/home/pl/.local/lib/python3.10/site-packages', '/usr/local/lib/python3.10/dist-packages', '/usr/lib/python3/dist-packages']

Это список адресов в Linux. В Windows он будет несколько другим. Первый элемент – пустая строка, что обозначает текущий каталог, то есть то место, где сохранена сама программа, импортирующая модуль. Если вы сохраните файл-модуль и файл-программу в одном каталоге, то интерпретатор без труда найдет модуль.

Также модуль можно положить в любой другой из указанных в списке каталогов. Тогда он будет доступен для всех программ на Python, а также его можно будет импортировать в интерактивном режиме.

Можно добавить в sys.path свой каталог. Однако в этом случае либо код программы должен содержать команды изменения значения sys.path , либо надо править конфигурационный файл операционной системы. В большинстве случаев лучше так не делать.

Поместите файл square.py в тот же каталог, где будет исполняемая программа. Ее код должен включать инструкцию импорта модуля square (при импорте расширение файла не указывается) и вызов той функции и с теми параметрами, которые ввел пользователь. То есть у пользователя надо спросить, площадь какой фигуры он хочет вычислить. Далее запросить у него аргументы для соответствующей функции. Передать их в функцию из модуля square , а полученный оттуда результат вывести на экран.

Примечание. Исполнение модуля как самостоятельного скрипта, а также создание строк документации, которые отображает встроенная в Python функция help() , будут рассмотрены в курсе объектно-ориентированного программирования.

Примеры решения и дополнительные уроки в pdf-версии курса

X Скрыть Наверх

Python. Введение в программирование

Модули

Модуль в языке Python представляет отдельный файл с кодом, который можно повторно использовать в других программах.

Для создания модуля необходимо создать собственно файл с расширением *.py , который будет представлять модуль. Название файла будет представлять название модуля. Затем в этом файле надо определить одну или несколько функций.

Допустим, основной файл программы называется main.py . И мы хотим подключить к нему внешние модули.

Для этого сначала определим новый модуль: создадим в той же папке, где находится main.py, новый файл, который назовем message.py . По умолчанию интерпретатор Python ищет модули по ряду стандартных путей, один из которых — это папка главного, запускаемого скрипта. Поэтому, чтобы интерпретатор подхватил модуль message.py, для простоты оба файла поместим в один проект.

Модули в Python

Соответственно модуль будет называться message . Определим в нем следующий код:

hello = "Hello all" def print_message(text): print(f"Message: ")

Здесь определена переменная hello и функция print_message, которая в качестве параметра получает некоторый текст и выводит его на консоль.

В основном файле программы — main.py используем данный модуль:

import message # подключаем модуль message # выводим значение переменной hello print(message.hello) # Hello all # обращаемся к функии print_message message.print_message("Hello work") # Message: Hello work

Для использования модуля его надо импортировать с помощью оператора import , после которого указывается имя модуля: import message .

Чтобы обращаться к функциональности модуля, нам нужно получить его пространство имен . По умолчанию оно будет совпадать с именем модуля, то есть в нашем случае также будет называться message .

Получив пространство имен модуля, мы сможем обратиться к его функциям по схеме

Например, обращение к функции print_message() из модуля message:

message.print_message("Hello work")

И после этого мы можем запустить главный скрипт main.py, и он задействует модуль message.py. В частности, консольный вывод будет следующим:

Hello all Message: Hello work

Подключение функциональности модуля в глобальное пространство имен

Другой вариант настройки предполагает импорт функциональности модуля в глобальное пространство имен текущего модуля с помощью ключевого слова from :

from message import print_message # обращаемся к функии print_message из модуля message print_message("Hello work") # Message: Hello work # переменная hello из модуля message не доступна, так как она не импортирована # print(message.hello) # print(hello)

В данном случае мы импортируем из модуля message в глобальное пространство имен функцию print_message() . Поэтому мы сможем ее использовать без указания пространства имен модуля как если бы она была определена в этом же файле.

Все остальные функции, переменные из модуля недоступны (как например, в примере выше переменная hello). Если мы хотим их также использовать, то их можно подключить по отдельности:

from message import print_message from message import hello # обращаемся к функции print_message из модуля message print_message("Hello work") # Message: Hello work # обращаемся к переменной hello из модуля message print(hello) # Hello all

Если необходимо импортировать в глобальное пространство имен весь функционал, то вместо названий отдельных функций и переменных можно использовать символ зводочки * :

from message import * # обращаемся к функции print_message из модуля message print_message("Hello work") # Message: Hello work # обращаемся к переменной hello из модуля message print(hello) # Hello all

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

from message import * print_message("Hello work") # Message: Hello work - применяется функция из модуля message def print_message(some_text): print(f"Text: ") print_message("Hello work") # Text: Hello work - применяется функция из текущего файла

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

Установка псевдонимов

При импорте модуля и его функциональности мы можем установить для них псевдонимы. Для этого применяется ключевое слово as , после которого указывается псевдоним. Например, установим псевдоним для модуля:

import message as mes # модуль message проецируется на псевдоним mes # выводим значение переменной hello print(mes.hello) # Hello all # обращаемся к функии print_message mes.print_message("Hello work") # Message: Hello work

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

Подобным образом можно установить псевдонимы для отдельной функциональности модуля:

from message import print_message as display from message import hello as welcome print(welcome) # Hello all - переменная hello из модуля message display("Hello work") # Message: Hello work - функция print_message из модуля message

Здесь для функции print_message из модуля message устанавливается псевдоним display, а для переменной hello — псевдоним welcome. И через эти псевдонимы мы сможем к ним обращаться.

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

from message import print_message as display def print_message(some_text): print(f"Text: ") # функция print_message из модуля message display("Hello work") # Message: Hello work # функция print_message из текущего файла print_message("Hello work") # Text: Hello work

Имя модуля

В примере выше модуль main.py, который является главным, использует модуль message.py. При запуске модуля main.py программа выполнит всю необходимую работу. Однако, если мы запустим отдельно модуль message.py сам по себе, то ничего на консоли не увидим. Ведь модуль message просто определяет функцию и переменную и не выполняет никаких других действий. Но мы можем сделать так, чтобы модуль message.py мог использоваться как сам по себе, так и подключаться в другие модули.

При выполнении модуля среда определяет его имя и присваивает его глобальной переменной __name__ (с обеих сторон по два подчеркивания). Если модуль является запускаемым, то его имя равно __main__ (также по два подчеркивания с каждой стороны). Если модуль используется в другом модуле, то в момент выполнения его имя аналогично названию файла без расширения py. И мы можем это использовать. Так, изменим содержимое файла message.py :

hello = "Hello all" def print_message(text): print(f"Message: ") def main(): print_message(hello) if __name__ == "__main__": main()

В данном случае в модуль message.py для тестирования функциональности модуля добавлена функция main . И мы можем сразу запустить файл message.py отдельно от всех и протестировать код.

Следует обратить внимание на вызов функции main:

if __name__ == "__main__": main()

Переменная __name__ указывает на имя модуля. Для главного модуля, который непосредственно запускается, эта переменная всегда будет иметь значение __main__ вне зависимости от имени файла.

Поэтому, если мы будем запускать скрипт message.py отдельно, сам по себе, то Python присвоит переменной __name__ значение __main__ , далее в выражении if вызовет функцию main из этого же файла.

Однако если мы будем запускать другой скрипт, а этот — message.py — будем подключать в качестве вспомогательного, для message.py переменная __name__ будет иметь значение message . И соответственно метод main в файле message.py не будет работать.

Данный подход с проверкой имени модуля является более рекомендуемым подходом, чем просто вызов метода main.

В файле main.py также можно сделать проверку на то, является ли модуль главным (хотя в прицнипе это необязательно):

import message def main(): message.print_message("Hello work") # Message: Hello work if __name__ == "__main__": main()

Python предоставляет ряд встроенных модулей, которые мы можем использовать в своих программах. В следующих статьях рассмотрим основные из них.

Модули¶

Как можно использовать код повторно, помещая его в функции, мы уже видели. А что, если нам понадобится повторно использовать различные функции в других наших программах? Как вы уже, наверное, догадались, ответ — модули.

Существуют разные способы составления модулей, но самый простой — это создать файл с расширением .py , содержащий функции и переменные.

Другой способ — написать модуль на том языке программирования, на котором написан сам интерпретатор Python. Например, можно писать модули на языке программирования C, которые после компиляции могут использоваться стандартным интерпретатором Python.

Модуль можно импортировать в другую программу, чтобы использовать функции из него. Точно так же мы используем стандартную библиотеку Python. Сперва посмотрим, как использовать модули стандартной библиотеки.

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

import sys print('Аргументы командной строки:') for i in sys.argv: print(i) print('\n\nПеременная PYTHONPATH содержит', sys.path, '\n') 

Вывод:

$ python3 using_sys.py we are arguments Аргументы командной строки: using_sys.py we are arguments Переменная PYTHONPATH содержит ['', 'C:\\Windows\\system32\\python30.zip', 'C:\\Python30\\DLLs', 'C:\\Python30\\lib', 'C:\\Python30\\lib\\plat-win', 'C:\\Python30', 'C:\\Python30\\lib\\site-packages'] 

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

В начале мы импортируем модуль sys командой import . Этим мы говорим Python, что хотим использовать этот модуль. Модуль sys содержит функции, относящиеся к интерпретатору Python и его среде, т. е. к системе (system).

Когда Python выполняет команду import sys , он ищет модуль sys . В данном случае это один из встроенных модулей, и Python знает, где его искать.

Если бы это был не скомпилированный модуль, т. е. модуль, написанный на Python, тогда интерпретатор Python искал бы его в каталогах, перечисленных в переменной sys.path . Если модуль найден, выполняются команды в теле модуля, и он становится доступным. Обратите внимание, что инициализация 1 происходит только при первом импорте модуля.

Доступ к переменной argv в модуле sys предоставляется при помощи точки, т. е. sys.argv . Это явно показывает, что это имя является частью модуля sys . Ещё одним преимуществом такого обозначения является то, что имя не конфликтует с именем переменной argv , которая может использоваться в вашей программе.

Переменная sys.argv является списком строк (списки будут детально обсуждаться в одной из последующих глав). Она содержит список аргументов командной строки, т. е. аргументов, переданных программе из командной строки.

Если вы используете среду разработки 2 для написания и запуска программ, поищите где-нибудь в её меню возможность передавать параметры командной строки.

В нашем примере, когда мы запускаем » python using_sys.py we are arguments «, мы запускаем модуль using_sys.py командой python , а всё, что следует далее — аргументы, передаваемые программе 3 . Python сохраняет аргументы командной строки в переменной sys.argv для дальнейшего использования.

Помните, что имя запускаемого сценария 4 всегда является первым аргументом в списке sys.argv . Так что в приведённом примере ‘using_sys.py’ будет элементом sys.argv[0] , ‘we’ — sys.argv[1] , ‘are’ — sys.argv[2] , а ‘arguments’ — sys.argv[3] . Помните, что в Python нумерация начинается с 0, а не с 1.

sys.path содержит список имён каталогов, откуда импортируются модули. Заметьте, что первая строка в sys.path пуста; эта пустая строка показывает, что текущая директория также является частью sys.path , которая совпадает со значением переменной окружения PYTHONPATH . Это означает, что модули, расположенные в текущем каталоге, можно импортировать напрямую. В противном случае придётся поместить свой модуль в один из каталогов, перечисленных в sys.path .

Помните, что текущий каталог — это каталог, в котором была запущена программа. Выполните » import os; print(os.getcwd()) «, чтобы узнать текущий каталог программы.

Файлы байткода .pyc¶

Импорт модуля — относительно дорогостоящее мероприятие, поэтому Python предпринимает некоторые трюки для ускорения этого процесса. Один из способов — создать байт-компилированные файлы (или байткод) с расширением .pyc , которые являются некой промежуточной формой, в которую Python переводит программу (помните раздел Введение о том, как работает Python?). Такой файл .pyc полезен при импорте модуля в следующий раз в другую программу — это произойдёт намного быстрее, поскольку значительная часть обработки, требуемой при импорте модуля, будет уже проделана. Этот байткод также является платформо-независимым.

Обычно файлы .pyc создаются в том же каталоге, где расположены и соответствующие им файлы .py . Если Python не может получить доступ для записи файлов в этот каталог, файлы .pyc созданы не будут.

Оператор from . import . ¶

Чтобы импортировать переменную argv прямо в программу и не писать всякий раз sys. при обращении к ней, можно воспользоваться выражением » from sys import argv «.

Для импорта всех имён, использующихся в модуле sys , можно выполнить команду » from sys import * «. Это работает для любых модулей.

В общем случае вам следует избегать использования этого оператора и использовать вместо этого оператор import , чтобы предотвратить конфликты имён и не затруднять чтение программы.

Пример:

from math import * n = int(input("Введите диапазон:- ")) p = [2, 3] count = 2 a = 5 while (count  n): b=0 for i in range(2,a): if ( i  sqrt(a)): if (a % i == 0): print(a,"непростое") b = 1 else: pass if (b != 1): print(a,"простое") p = p + [a] count = count + 1 a = a + 2 print(p) 

Имя модуля — name

У каждого модуля есть имя, и команды в модуле могут узнать имя их модуля. Это полезно, когда нужно знать, запущен ли модуль как самостоятельная программа или импортирован. Как уже упоминалось выше, когда модуль импортируется впервые, содержащийся в нём код исполняется. Мы можем воспользоваться этим для того, чтобы заставить модуль вести себя по-разному в зависимости от того, используется ли он сам по себе или импортируется в другую программа. Этого можно достичь с применением атрибута модуля под названием __name__ .

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

if __name__ == '__main__': print('Эта программа запущена сама по себе.') else: print('Меня импортировали в другой модуль.') 

Вывод:

$ python3 using_name.py Эта программа запущена сама по себе. $ python3 >>> import using_name Меня импортировали в другой модуль. >>> 

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

В каждом модуле Python определено его имя — __name__ 5 . Если оно равно ‘__main__’ , это означает, что модуль запущен самостоятельно пользователем, и мы можем выполнить соответствующие действия.

Создание собственных модулей¶

Создать собственный модуль очень легко. Да вы всё время делали это! Ведь каждая программа на Python также является и модулем. Необходимо лишь убедиться, что у неё установлено расширение .py . Следующий пример объяснит это.

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

def sayhi(): print('Привет! Это говорит мой модуль.') __version__ = '0.1' # Конец модуля mymodule.py 

Выше приведён простой модуль. Как видно, в нём нет ничего особенного по сравнению с обычной программой на Python. Далее посмотрим, как использовать этот модуль в других наших программах.

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

Ещё один модуль (сохраните как mymodule_demo.py ):

import mymodule mymodule.sayhi() print ('Версия', mymodule.__version__) 

Вывод:

$ python mymodule_demo.py Привет! Это говорит мой модуль. Версия 0.1 

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

Обратите внимание, что мы используем всё то же обозначение точкой для доступа к элементам модуля. Python повсеместно использует одно и то же обозначение точкой, придавая ему таким образом характерный «Python-овый» вид и не вынуждая нас изучать всё новые и новые способы делать что-либо.

Вот версия, использующая синтаксис from..import (сохраните как mymodule_demo2.py ):

from mymodule import sayhi, __version__ sayhi() print('Версия', __version__) 

Вывод mymodule_demo2.py такой же, как и mymodule_demo.py .

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

Вы могли бы также использовать:

from mymodule import * 

Это импортирует все публичные имена, такие как sayhi , но не импортирует __version__ , потому что оно начинается с двойного подчёркивания

Одним из руководящих принципов в Python является «Явное лучше Неявного». Выполните команду » import this «, чтобы узнать больше, а также просмотрите это обсуждение, в котором приводятся примеры по каждому из принципов.

Функция dir¶

Встроенная функция dir() возвращает список имён, определяемых объектом. Например, для модуля в этот список входят функции, классы и переменные, определённые в этом модуле.

Эта функция может принимать аргументы. Если в качестве аргумента указано имя модуля, она возвращает список имён, определённых в этом модуле. Если никакого аргумента не передавать, она вернёт список имён, определённых в текущем модуле.

Пример:

$ python3 >>> import sys # получим список атрибутов модуля 'sys' >>> dir(sys) ['__displayhook__', '__doc__', '__excepthook__', '__name__', '__package__', '__s tderr__', '__stdin__', '__stdout__', '_clear_type_cache', '_compact_freelists', '_current_frames', '_getframe', 'api_version', 'argv', 'builtin_module_names', ' byteorder', 'call_tracing', 'callstats', 'copyright', 'displayhook', 'dllhandle' , 'dont_write_bytecode', 'exc_info', 'excepthook', 'exec_prefix', 'executable', 'exit', 'flags', 'float_info', 'getcheckinterval', 'getdefaultencoding', 'getfil esystemencoding', 'getprofile', 'getrecursionlimit', 'getrefcount', 'getsizeof', 'gettrace', 'getwindowsversion', 'hexversion', 'intern', 'maxsize', 'maxunicode ', 'meta_path', 'modules', 'path', 'path_hooks', 'path_importer_cache', 'platfor m', 'prefix', 'ps1', 'ps2', 'setcheckinterval', 'setprofile', 'setrecursionlimit ', 'settrace', 'stderr', 'stdin', 'stdout', 'subversion', 'version', 'version_in fo', 'warnoptions', 'winver'] >>> dir() # получим список атрибутов текущего модуля ['__builtins__', '__doc__', '__name__', '__package__', 'sys'] >>> a = 5 # создадим новую переменную 'a' >>> dir() ['__builtins__', '__doc__', '__name__', '__package__', 'a', 'sys'] >>> del a # удалим имя 'a' >>> dir() ['__builtins__', '__doc__', '__name__', '__package__', 'sys'] >>> 

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

Сперва мы видим результат применения dir к импортированному модулю sys . Видим огромный список атрибутов, содержащихся в нём.

Затем мы вызываем функцию dir , не передавая ей параметров. По умолчанию, она возвращает список атрибутов текущего модуля. Обратите внимание, что список импортированных модулей также входит туда.

Чтобы пронаблюдать за действием dir , мы определяем новую переменную a и присваиваем ей значение, а затем снова вызываем dir . Видим, что в полученном списке появилось дополнительное значение. Удалим переменную/атрибут из текущего модуля при помощи оператора del , и изменения вновь отобразятся на выводе функции dir .

Замечание по поводу del : этот оператор используется для удаления переменной/имени, и после его выполнения, в данном случае — del a , к переменной a больше невозможно обратиться — её как будто никогда и не было.

Обратите внимание, что функция dir() работает для любого объекта. Например, выполните » dir(‘print’) «, чтобы увидеть атрибуты функции print , или » dir(str) «, чтобы увидеть атрибуты класса str .

Пакеты¶

К настоящему времени вы, вероятно, начали наблюдать некоторую иерархию в организации ваших программ. Переменные обычно находятся в функциях. Функции и глобальные переменные обычно находятся в модулях. А что, если возникнет необходимость как-то организовать модули? Вот здесь-то и выходят на сцену пакеты.

Пакеты — это просто каталоги с модулями и специальным файлом __init__.py , который показывает Python, что этот каталог особый, так как содержит модули Python.

Представим, что мы хотим создать пакет под названием «world» с субпакетами «asia», «africa» и т. д., которые, в свою очередь, будут содержать модули «india», «madagascar» и т. д.

Для этого следовало бы создать следующую структуру каталогов:

| - / | |---- world/ | |---- __init__.py | |---- asia/ | | |---- __init__.py | | |---- india/ | | |---- __init__.py | | |---- foo.py | |---- africa/ | |---- __init__.py | |---- madagascar/ | |---- __init__.py | |---- bar.py 

Пакеты — это удобный способ иерархически организовать модули. Такое часто встречается в стандартной библиотеке.

Резюме¶

Точно так же, как функции являются многократно используемыми фрагментами программ, модули являются многократно используемыми программами. Пакеты — это способ иерархической организации модулей. Стандартная библиотека Python является примером такого набора пакетов и модулей.

Мы увидели, как пользоваться этими модулями и создавать свои.

Далее мы познакомимся с некоторыми интересными концепциями, называемыми «структуры данных».

  1. Инициализация — ряд действий, производимых при начальной загрузке (прим. перев.) ↩
  2. IDE — от англ. «Integrated Development Environment» — «интегрированная среда разработки» (прим. перев.) ↩
  3. «we are arguments» — англ. «мы аргументы» (прим. перев.) ↩
  4. Программу на интерпретируемом языке программирования также называют сценарием или скриптом (прим. перев.) ↩
  5. name — англ. «имя» (прим. перев.) ↩

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *