Изучаем Python. №18. Пишем свой модуль на python3


Сегодня мы научимся азам написания своих модулей на python. Но, сначала разберемся как вообще работает система подключения модулей.
Когда вы подключаете модуль в вашу программу, то интерпретатор ищет его в первую очередь сначала в текущем каталоге, если модуля с указанным именем там нет, то он обращается к каталогам указанным в переменной окружения PYTHONPATH,в зависящих от платформы путях по умолчанию и, на конец, в специальных файлах с расширением ‘.pth’, которые лежат в стандартных каталогах.
Вы можете внести свой путь в PYTHONPATH и ‘.pth’. Все каталоги, в которых происходит поиск можно посмотреть в переменной sys.path.


В моем случае это:
[‘C:\\Python\\projects’, ‘C:\\Python\\projects’, ‘C:\\Python\\Python35-32\\python35.zip’, ‘C:\\Python\\Python35-32\\DLLs’, ‘C:\\Python\\Python35-32\\lib’, ‘C:\\Python\\Python35-32’, ‘C:\\Python\\Python35-32\\lib\\site-packages’]
Так же, при импортировании модуля можно узнать все его имена атрибутов:

import sys
print (dir(sys))

Результат:

['__displayhook__', '__doc__', '__excepthook__', '__interactivehook__', '__loader__', '__name__', '__package__', '__spec__', '__stderr__', '__stdin__', '__stdout__', '_clear_type_cache', '_current_frames', '_debugmallocstats', '_getframe', '_home', '_mercurial', '_xoptions', 'api_version', 'argv', 'base_exec_prefix', 'base_prefix', 'builtin_module_names', 'byteorder', 'call_tracing', 'callstats', 'copyright', 'displayhook', 'dllhandle', 'dont_write_bytecode', 'exc_info', 'excepthook', 'exec_prefix', 'executable', 'exit', 'flags', 'float_info', 'float_repr_style', 'get_coroutine_wrapper', 'getallocatedblocks', 'getcheckinterval', 'getdefaultencoding', 'getfilesystemencoding', 'getprofile', 'getrecursionlimit', 'getrefcount', 'getsizeof', 'getswitchinterval', 'gettrace', 'getwindowsversion', 'hash_info', 'hexversion', 'implementation', 'int_info', 'intern', 'is_finalizing', 'maxsize', 'maxunicode', 'meta_path', 'modules', 'path', 'path_hooks', 'path_importer_cache', 'platform', 'prefix', 'set_coroutine_wrapper', 'setcheckinterval', 'setprofile', 'setrecursionlimit', 'setswitchinterval', 'settrace', 'stderr', 'stdin', 'stdout', 'thread_info', 'version', 'version_info', 'warnoptions', 'winver']

Наш модуль будет состоять из двух файлов __init__.py и modul.py. Файл __init__.py является конфигурационным и не должен содержать какие-либо функции и переменные. Всу логику вашего модуля необходимо описывать непосредственно в module.py (на самом деле вы можете назвать его как угодно, даже piupiu.py). По правде и __init__.py можно не создавать, если ваш модуль состоит всего лишь из одного файла. __init__.py нужен для формирования пакета — набора модулей одной программы. В нем вы сможете разместить описание вашего модуля.
Я на примере покажу что такое модуль и пакет. Для начала создадим модуль shutnik.py в той же папке где и ваш основной файл main.py.
Код модуля:

import random
def rs():
    a = (random.randrange(1, 5, 1)) #от 1 до 5 с шагом в 1 число
    print ('Случайная шутка №'+str(a))
    if a == 1:
        print('Сельский паркур начинается со слова "Шухер! ".')
    if a == 2:
        print('Финансовое положение: уже не парюсь, закрыл ли дверь на ключ.')
    if a == 3:
        print('Мальчик, который плохо разбирается в сторонах света, осенью смотрит, как птицы улетают направо.')
    if a == 4:
        print('Зрители так и не заметили показательного выступления профессиональных ниндзя.')
    if a == 5:
        print('Перед употреблением взболтнуть лишнего.')

Теперь подключаем его к нашему основному файлу:

# -*- coding: utf-8 -*-
import shutnik as sh
sh.rs()

И теперь, если вы выполните его, то увидите, что он выводит случайную шутку.
ничего сложного. Теперь создадим пакет. Это тоже просто. Для начала создаем папку ‘fmd’ (сокращенно от firstmodule) и уже внутри нее __init__.py, modul.py hello.py
Код __init__.py:

__all__ = ["modul", "hello"]
def name():
  return "Мой тестовый модуль"

def description():
  return "Это реально рабочий модуль"

def version():
  return "Version 0.1"

Код modul.py:

def summ(x,y):
    z = x+y
    return z

def delete(x,y):
    z = x-y
    return z

Код hello.py:

def hello(name):
    a = 'hello!'+name
    print(a)

Теперь, чтобы пакет заработал, его папку нужно копировать в каталог модулей. У меня он находиться тут C:\Python\Python35-32\Lib\site-packages\
Если вы все сделали как нужно, тогда изменим наш main.py и посмотрим результат.
Код main.py:

# -*- coding: utf-8 -*-
import shutnik as sh
from fmd import hello as h,modul as m

h.hello('Виталий')
print('Сумма чисел: '+str(m.summ(10,20)))
print('50 - 20 = '+str(m.delete(50,40)))
sh.rs()

Результат:

hello!Виталий
Сумма чисел: 30
50 - 20 = 10
Случайная шутка №4
Зрители так и не заметили показательного выступления профессиональных ниндзя.

На этом все, оставляйте свои вопросы и замечания в комментариях.

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

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

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.