Как мне организовать исходный код Python? [закрыто]

99

Я начинаю работать с Python (пора попробовать) и ищу передовой опыт.

Мой первый проект - это очередь, которая запускает эксперименты из командной строки в нескольких потоках. У меня получается очень длинный main.pyфайл, и я хочу его разбить. В общем, я ищу: как программисты на Python организуют несколько исходных файлов? Есть ли конкретная структура, которая вам подходит?

Мои конкретные вопросы включают:

  1. Должен ли каждый класс быть в отдельном файле?
  2. Как мне организовать модульные тесты относительно исходного кода?
  3. Куда мне помещать комментарии к документам, особенно те, которые используются в командной строке?
  4. Если я использую несколько каталогов, как мне импортировать классы между ними?

Я, наверное, смогу сделать некоторые из своих выводов здесь методом проб и ошибок, но лучше начать с чего-нибудь хорошего .

Андрес Яан Так
источник
4
Это объяснит кое-что об организации вашего кода. Docs.python.org/tutorial/modules.html
Никола Смилянич
2
Вот еще одна полезная информация из документов python. <br> docs.python.org/3/tutorial/modules.html#packages
rda3mon,
11
Этот вопрос находится в поиске общепринятого соглашения, особенно в сообществе Python. Ответ - это не вопрос мнения, хотя, как и большинство других ответов, со временем он может измениться. Я предлагаю открыть его повторно или, по крайней мере, восстановить исходный ответ.
Andres Jaan Tack

Ответы:

32

Статья Эрик указала на это удивительный , потому что он охватывает деталь организации больших баз коды на Python.

Если вы перешли сюда из Google и пытаетесь выяснить, как разделить один большой исходный файл на несколько более управляемых файлов, я кратко опишу этот процесс.

Предположим, у вас в настоящее время есть все в файле с именем main.py:

  • Создайте еще один исходный файл в той же папке (назовем наш utils.pyдля этого примера)
  • Переместите любые классы, функции, операторы и т. Д., Которые вам нужны, main.pyвutils.py
  • В main.pyдобавить одну строку в верхней части:import utils

По сути, это создает новый модуль, вызываемый utilsв другом исходном файле. Затем вы можете импортировать его куда угодно.

Дрю Ноукс
источник
Вы случайно не помните статью, на которую указал Эрик? Я не могу найти Эрика по этому вопросу / ответу
Даниэль Руччи
7
@DanR, да, это статья . По какой-то причине модератор удалил свой ответ, несмотря на то, что за него было 56 голосов.
Дрю Ноукс
1
@DrewNoakes: Думаю, он был удален из-за того, что это ответ только для ссылки; если бы он только резюмировал основные положения статьи.
smci
1
К сожалению, ссылка на статью сейчас не работает :-(. Последняя заархивированная версия находится здесь: web.archive.org/web/20190714164001/http://…
Игорь Брейц
7

То, как вы должны организовать свой код и тесты, точно такое же, как и для любого объектно-ориентированного языка.

Ответы, как я это делаю. Это может быть неправильно, но работает для меня

  1. Зависит от того, как разделены ваши функции. Для моего основного приложения на Python у меня есть 1 файл с классами для точек входа, а затем пакеты с различными функциональными возможностями.
  2. Я использую PyDev для eclipse и организую его, как для Java.
>  Workspace
>     |
>     |-Src
>     |   |-Package1
>     |   |-Package2
>     |   |-main.py
>     |-Test
>         |-TestPackage1
>         |-TestPackage2
  1. Используйте DocString везде, чтобы отслеживать все
  2. Убедившись, что нужные __init__.pyфайлы находятся в папках. это просто случайfrom module import class
AutomatedTester
источник
5
Однако одно предостережение: java устанавливает своего рода диктаторские отношения с пакетами, файлами и классами. Иногда у меня получается намного больше исходных файлов, чем мне бы хотелось. Соглашения некоторых организаций - например, избегать (вложенных) внутренних классов или «вспомогательных» классов ниже в файле - делают это хуже, превышая требования компилятора. Держите его в порядке, и иерархия полезна, но старайтесь избегать надстройки.
Робопрог,