Python 3. Модули

Из этой статьи вы узнаете что такое модули в Python, для чего они нужны и как с ними можно работать. Познакомимся с операторами import, from и as.















Что такое модули в Python




Модулем в Python 3 является любой файл с кодом. Модули можно импортировать в другие модули, это решает следующие задачи:




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



  • Благодаря модулям можно разбить одну большую программу на несколько частей (модулей). И работать с ними по отдельности.




Задачи которые решают модули в Python
Задачи которые решают модули в Python




Импортирование модулей




Для импорта модуля используется два оператора:




  • import — импорт модуля, при котором к объектам модуля (переменным, функциям и т.д.) можно обращаться через имя модуля;



  • from — извлечение отдельных объектов из модуля, при этом к таким объектам можно будет обращаться напрямую.




Ниже разберём разницу на примерах.




Давайте напишем следующий модуль mod_1.py:




a = 15
my_str = "test_string"
def hello():
    print("Hello World!")




Оператор import




Теперь напишем основную программу, в которую импортируем наш модуль с помощью оператора import. А затем выполним функцию из модуля:




import mod_1
mod_1.hello()

### результат выполнения
Hello World!




Важно положить файл основной программы и модуля в один каталог. Ниже я объясню где Python ищет файлы модулей.




Оператор from




Теперь импортируем наш модуль с помощью оператора from. Здесь после оператора from идёт имя модуля, а затем оператор import и имя импортируемого объекта:




from mod_1 import hello
hello()

### результат выполнения
Hello World!




Из примера видно, что мы обращаемся к функции hello() напрямую.




Кстати, чтобы импортировать все объекты с помощью from … import используется такая конструкция:




from mod_1 import *
hello()
print(a)

### результат выполнения
Hello World!
15




Разница между import и from




В предыдущих примерах вы должны были увидеть разницу между import и from … import. Если используется import, вы должны обращаться к объектам модуля через точку (имя_модуля.имя_объекта). А если используется from … import, то вы можете обращаться к объектам модуля напрямую.




Разница между import и from … import




Импортирование с помощью from … import * может показаться лучше, так как объекты из модуля становятся объектами программы, и к ним можно обращаться напрямую. Но если вы импортируете несколько модулей, а в них окажутся объекты с одинаковыми именами, то программа поломается, так как одни объекты перезапишут другие. Поэтому в таких случаях нужно использовать оператор import.




Например создадим ещё один модуль (mod_2.py), в нём также будет присутствовать переменная ‘a‘:




a = 20




И импортируем оба модуля в нашу программу:




import mod_1
import mod_2
print(mod_1.a)
print(mod_2.a)

### результат выполнения
15
20




А теперь импортируем эти-же самые модули с помощью from … import *:




from mod_1 import *
from mod_2 import *
print(a)

### результат выполнения
20




Как видите, второй модуль переопределил значение переменной ‘a‘. Но ниже я покажу как это можно обойти.




Задание имени импортируемого модуля




Импортируемому модулю или объекту (если используется оператор from) можно задать имя с помощью оператора as, например:




import mod_1 as m
m.hello()

### результат выполнения
Hello World!




Кстати, это позволяет импортировать объекты с одинаковыми именами с помощью from, следующим образом:




from mod_1 import a as m1a
from mod_2 import a as m2a
print(m1a)
print(m2a)

### результат выполнения
15
20




Не импортируемые переменные




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




Например исправим наш второй модуль (mod_2.py):




_a = 20
_b = 30
def my_func():
    return(_a + _b)




Импортируем этот модуль в программу и попробуем обратиться к переменным ‘_a‘ и ‘_b‘:




from mod_2 import *
print(_a, _b)

### результат выполнения
NameError: name '_a' is not defined. Did you mean: 'a'?




Зато функцию использовать мы сможем:




from mod_2 import *
print(my_func())

### результат выполнения
50




А вот импортирование с помощью import позволит обращаться к таким объектам:




import mod_2
print(mod_2._a)

### результат выполнения
20




Выполнение модулей




Когда мы импортируем модуль, то его код выполняется. Происходит выполнение в момент импорта. Например, исправим наш второй модуль (mod_2.py) таким образом:




print("Запускает второй модуль")
_a = 20
_b = 30
def my_func():
    return(_a + _b)




А в основной программе просто импортируем этот модуль и больше ничего выполнять не будем:




import mod_2

### результат выполнения
Запускает второй модуль




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




Атрибут модуля __name__




У каждого модуля есть атрибут __name__, который может принимать разные значения:




  • Если модуль вызывается как программа верхнего уровня, то этот атрибут принимает значение __main__.



  • А если этот модуль импортируется в другой модуль (в основную программу) то атрибут __name__ примет значение имени модуля.




Например, ещё раз изменим код второго модуля и выполним этот модуль:




if __name__ == '__main__':
    print("Запускаем модуль как программу")
else:
    print("Запускаем модуль как модуль")

### результат выполнения
Запускаем модуль как программу




Теперь импортируем этот модуль в основную программу и выполним её:




import mod_2

### результат выполнения
Запускаем модуль как модуль




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









Встроенные модули и сторонние пакеты




Встроенные модули




В Python 3 есть множество встроенных модулей (built-in modules). Они написаны на языке C и интегрированы в интерпретатор Python. Чтобы посмотреть список встроенных модулей нужно воспользоваться одним из них — модулем sys.




Модуль sys предоставляет доступ к системным функциям и переменным.




Посмотрим с помощью него на список встроенные модулей:




import sys
print(sys.builtin_module_names)

### результат выполнения
('_abc', '_ast', '_bisect', '_blake2', '_codecs', '_codecs_cn', '_codecs_hk', '_codecs_iso2022', '_codecs_jp', '_codecs_kr', '_codecs_tw', '_collections', '_contextvars', '_csv', '_datetime', '_functools', '_heapq', '_imp', '_io', '_json', '_locale', '_lsprof', '_md5', '_multibytecodec', '_opcode', '_operator', '_pickle', '_random', '_sha1', '_sha256', '_sha3', '_sha512', '_signal', '_sre', '_stat', '_statistics', '_string', '_struct', '_symtable', '_thread', '_tokenize', '_tracemalloc', '_typing', '_warnings', '_weakref', '_winapi', '_xxsubinterpreters', 'array', 'atexit', 'audioop', 'binascii', 'builtins', 'cmath', 'errno', 'faulthandler', 'gc', 'itertools', 'marshal', 'math', 'mmap', 'msvcrt', 'nt', 'sys', 'time', 'winreg', 'xxsubtype', 'zlib')




Также, с помощью этого модуля можно узнать много другой информации:




import sys
print("Версия Python - ", sys.version, 'n')
print("Модули при импорте ищутся в этих каталогах:", sys.path, 'n')
print("Кодировка - ", sys.getdefaultencoding(), 'n')
print("Платформа: ", sys.platform, 'n')

### результат выполнения
Версия Python -  3.11.1 (tags/v3.11.1:a7a450f, Dec  6 2022, 19:58:39) [MSC v.1934 64 bit (AMD64)] 

Модули при импорте ищутся в этих каталогах: 
['c:\Users\User\Documents\python', 
'C:\Users\User\AppData\Local\Programs\Python\Python311\python311.zip', 
'C:\Users\User\AppData\Local\Programs\Python\Python311\Lib', 
'C:\Users\User\AppData\Local\Programs\Python\Python311\DLLs', 
'C:\Users\User\AppData\Roaming\Python\Python311\site-packages', 
'C:\Users\User\AppData\Roaming\Python\Python311\site-packages\win32', 
'C:\Users\User\AppData\Roaming\Python\Python311\site-packages\win32\lib', 
'C:\Users\User\AppData\Roaming\Python\Python311\site-packages\Pythonwin', 
'C:\Users\User\AppData\Local\Programs\Python\Python311', 
'C:\Users\User\AppData\Local\Programs\Python\Python311\Lib\site-packages']

Кодировка -  utf-8

Платформа:  win32




Модули при импорте ищутся вначале в каталоге программы (у меня это — c:UsersUserDocumentspython), затем в следующих каталогах, перечисленных в sys.path. Ну а встроенные модули — встроены в интерпретатор.




Ниже я рассмотрю ещё несколько встроенных модулей.




Модуль math — содержит множество математический функций, например:




import math
print(math.factorial(5)) # Факториал
print(math.fmod(16, 3))  # Остаток от деления
print(math.log10(1000) ) # Логарифм 1000 по основанию 10
print(math.log2(8))      # Логарифм 4 по основанию 2
print(math.sqrt(16))     # Квадратный корень из 16

### результат выполнения
120
1.0
3.0
3.0
4.0




Модуль os — позволяет работать с операционной системой:




import os
print(os.getcwd())           # Текущая директория
print(os.listdir(path="."))  # Список файлов в директории
print(os.getlogin())         # Имя пользователя
print(os.getpid() )          # Текущий pid процесса




Сторонние пакеты




Также в систему можно установить дополнительные модули с помощью утилиты командной строки pip, для этого в командной строке нужно выполнить:




pip install <имя_пакета>




Пакет — это каталог с модулями для решения определённой задачи.




На windows скорее всего эти пакеты будут скачаны в каталог:




C:Users<Имя_пользователя>AppDataLocalProgramsPythonPython<версия>Libsite-packages<имя пакета>




Получить список всех модулей (встроенных и установленных) можно таким образом:




help('modules')

### результат выполнения
IPython             backcall            mmsystem            telebot
__future__          base64              mod_1               telebot_router
__hello__           bdb                 mod_2               telnetlib
__phello__          binascii            modulefinder        tempfile
_abc                bisect              msilib              test
_aix_support        builtins            msvcrt              test2
_ast                bz2                 multiprocessing     textwrap
_asyncio            cProfile            nest_asyncio        this
_bisect             calendar            netbios             threading
_blake2             certifi             netrc               time
_bootsubprocess     cgi                 nntplib             timeit
_bz2                cgitb               nt                  timer
_codecs             charset_normalizer  ntpath              tkinter
### вывод сократил, так как он очень большой




Я, например, использовал следующие пакеты:




  • proxmoxer — для работы с proxmox кластером;



  • requests — для http запросов (требуется для proxmoxer);



  • telebot — для написания ботов для telegram;



  • psycopg2 — для работы с PostgreSQL.




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




Вы и сами можете создать папку для написания своих модулей, а затем импортировать эти модули таким образом:




import <название_пакета>.<название_модуля>




Итог




После прочтения этой статьи вы должны лучше понимать зачем нужны модули в Python 3. А также должны уметь создавать свои модули, устанавливать сторонние модули и использовать встроенные модули.




Я описал работу трёх операторов: import, from, as. Рассказал про не-импортируемые объекты, имена которых начинаются на нижнее подчеркивание, и про атрибут __name__.




Другие статьи по python 3 можете посмотреть здесь.




Документацию про модули (на английском языке) читайте здесь.



2023-05-26T14:06:26
Python