LINUX.ORG.RU

Правильная архитектура программы в Python

 


2

3

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

Возникла потребность вторично использовать уже написанный код. Можно, конечно, делать

from main import some_function
но есть одна заковырка. Мне необходимо увеличить скорость импорта из главного модуля. При этом возникают следующие вопросы:

1) Что делать с внешними модулями (os, sys, difflib, pyperclip, zipfile, rarfile, pyunpack, codecs, re, time, shutil, webbrowser...)? Если подгружать все сразу, то даже импорт какого-нибудь примитива из главного модуля займет несколько секунд из-за подгрузки всех внешних модулей. Если же подгружать модули в случае необходимости, то, во-первых, как проверить их существование на самом старте и сообщить об этом, а не ловить ошибки посреди работы, а во-вторых, придется во все функции вставлять import, что не очень хорошо хотя бы потому, что одни и те же модули могут загружаться несколько раз (хотя я и не знаю, как это реализовано, может, python умный и не делает импорт из тех же самых модулей по нескольку раз).

2) Программа использует кучу глобальных переменных, которые подгружаются из внешнего файла посредством parser.get (.getint, .getfloat и т.д.). Возникает такой же вопрос, как и с модулями. Кроме того, как мне объявлять эти переменные? Просто в теле главного модуля? Тогда каждый мало-мальский импорт из главного модуля потребует наличия конфигурационного файла. А если в виде функции, то как сделать загружаемые из конфига переменные глобальными? Большинство переменных нужны на чтение, но некоторые нужны и на запись. Бывалые питонисты не рекомендуют использовать global. Кроме того, рекомендуется объявлять переменные явно, а не через exec и eval, потому что это угроза безопасности. Но при этом опять оказывается необходимым тащить с собой конфиг.

3) В каждой функции, чтобы иметь возможность контролировать ее результат, я использую логирование. Логирование также может использовать внешние модули (например, os), а также некоторые глобальные переменные (на чтение). Что с этим делать? Поставить заглушку, если условие if __name__ == '__main__' не выполняется?

4) Я не особо опытен, программирую на питоне год или полтора для собственных нужд. На данный момент весь код стремлюсь оформлять в виде функций. Нужно ли переходить на классы или это просто разные парадигмы?

Deleted

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

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

П.С. не программист, но мнение имею.

yvv ★★☆
()
Ответ на: комментарий от yvv

П.С. не программист, но мнение имею.

история всей ветки Development в одной фразе

Virtuos86 ★★★★★
()
Ответ на: комментарий от yvv

Я тоже не программист :) На самом деле, главное, чтобы совет был дельный.

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

Я вот что подумал. Можно ли компилировать проекты в *.pyc и/или в бинарники (например, в *.exe через cx_freeze) так, чтобы в компилируемом коде незадействованные модули и функции были выброшены?

Deleted
()
Ответ на: комментарий от Deleted

компилировать проекты в *.pyc и/или в бинарники (например, в *.exe через cx_freeze) так, чтобы в компилируемом коде незадействованные модули и функции были выброшены?

нет, так не получится.

все-таки питон чересчур дружелюбный ЯП :-/

Virtuos86 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.