Как мне организовать исходный код 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

5
Однако одно предостережение: java устанавливает своего рода диктаторские отношения с пакетами, файлами и классами. Иногда у меня получается намного больше исходных файлов, чем мне бы хотелось. Соглашения некоторых организаций - например, избегать (вложенных) внутренних классов или «вспомогательных» классов ниже в файле - делают это хуже, превышая требования компилятора. Держите его в порядке, и иерархия полезна, но старайтесь избегать надстройки.
Робопрог,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.