- en
- Language: ru
- Documentation version: latest
Создание своих модулей
Модуль - это файл с расширением .py и кодом Python.
Пример создания своих модулей и импорта функции из одного модуля в другой.
Файл check_ip_function.py:
import ipaddress
def check_ip(ip):
try:
ipaddress.ip_address(ip)
return True
except ValueError as err:
return False
ip1 = '10.1.1.1'
ip2 = '10.1.1'
print('Проверка IP...')
print(ip1, check_ip(ip1))
print(ip2, check_ip(ip2))
В файле check_ip_function.py создана функция check_ip, которая проверяет, что аргумент является IP-адресом. Тут проверка выполняется с помощью модуля ipaddress, который будет рассматриваться в следующем разделе.
Функция ipaddress.ip_address сама проверяет правильность IP-адреса и генерирует исключение ValueError, если адрес не прошел проверку.
Функция check_ip возвращает True, если адрес прошел проверку и False - если нет.
Если запустить скрипт check_ip_function.py вывод будет таким:
$ python check_ip_function.py
Проверка IP...
10.1.1.1 True
10.1.1 False
Второй скрипт импортирует функцию check_ip и использует ее для того чтобы из списка адресов отобрать только те, которые прошли проверку (файл get_correct_ip.py):
from check_ip_function import check_ip
def return_correct_ip(ip_addresses):
correct = []
for ip in ip_addresses:
if check_ip(ip):
correct.append(ip)
return correct
print('Проверка списка IP-адресов')
ip_list = ['10.1.1.1', '8.8.8.8', '2.2.2']
correct = return_correct_ip(ip_list)
print(correct)
В первой строке выполняется импорт функции check_ip из модуля check_ip_function.py.
Результат выполнения скрипта:
$ python get_correct_ip.py
Проверка IP...
10.1.1.1 True
10.1.1 False
Проверка списка IP-адресов
['10.1.1.1', '8.8.8.8']
Обратите внимание, что выведена не только информация из скрипта get_correct_ip.py,
но и информация из скрипта check_ip_function.py.
Так происходит из-за того, что любая разновидность import выполняет весь скрипт.
То есть, даже когда импорт выглядит как from check_ip_function import check_ip
,
выполняется весь скрипт check_ip_function.py, а не только функция check_ip.
В итоге будут выводиться все сообщения импортируемого скрипта.
Сообщения из импортируемого скрипта не страшны, они мешают и только, хуже когда скрипт выполнял что-то типа подключения к оборудованию и при импорте функции из него, придется ждать пока это подключение выполнится.
В Python есть возможность указать, что некоторые строки не должны выполняться при импорте. Это рассматривается в следующем подразделе.
Примечание
Функцию return_correct_ip можно заменить filter или генератором списка, выше используется более длинный, но скорее всего, пока что более понятный вариант:
In [19]: list(filter(check_ip, ip_list))
Out[19]: ['10.1.1.1', '8.8.8.8']
In [20]: [ip for ip in ip_list if check_ip(ip)]
Out[20]: ['10.1.1.1', '8.8.8.8']
In [21]: def return_correct_ip(ip_addresses):
...: return [ip for ip in ip_addresses if check_ip(ip)]
...:
In [22]: return_correct_ip(ip_list)
Out[22]: ['10.1.1.1', '8.8.8.8']