Питонический способ организации модулей и пакетов

Я исхожу из опыта, когда я обычно создаю по одному файлу для каждого класса. Общие классы я также организовываю по каталогам. Мне эта практика интуитивно понятна, и она доказала свою эффективность в C ++, PHP, JavaSript и т. Д.

У меня проблемы с переносом этой метафоры в Python: файлы больше не просто файлы, это формальные модули. Кажется неправильным иметь только один класс в модуле - большинство классов сами по себе бесполезны. Если у меня есть классы automobile.py и Automobile, было бы глупо всегда ссылаться на него как на automobile.Automobile.

Но в то же время не кажется правильным помещать тонну кода в один файл и доводить дело до конца. Очевидно, что в очень сложном приложении должно быть более 5 файлов.

Какой правильный --- или питонический --- способ? (Или, если нет правильного способа, какой вы предпочитаете и почему?) Сколько кода я должен добавить в модуль Python?


person carl    schedule 26.11.2009    source источник
comment
Дубликат: stackoverflow.com/questions / 1642975 /   -  person S.Lott    schedule 26.11.2009
comment
Дубликат: stackoverflow.com/questions/106896/   -  person S.Lott    schedule 26.11.2009


Ответы (5)


Подумайте о «логической единице упаковки», которая может быть одним классом, но чаще всего это будет набор классов, которые тесно взаимодействуют друг с другом. Классы (или функции уровня модуля - не «делайте Java в Python», всегда используя статические методы, если функции уровня модуля также доступны в качестве выбора! -) можно сгруппировать на основе этого критерия. По сути, если большинству пользователей A также нужен B, и наоборот, A и B, вероятно, должны быть в одном модуле; но если многим пользователям понадобится только один из них, а не другой, тогда они, вероятно, должны быть в разных модулях (возможно, в одном пакете, то есть в каталоге с файлом __init__.py в нем).

Стандартная библиотека Python, хотя и далека от совершенства, имеет тенденцию отражать (в основном) разумные передовые практики, поэтому вы можете в основном учиться на ее примере. Например, модуль threading, конечно, определяет класс Thread ... но он также содержит классы примитивов синхронизации, такие как блокировки, события, условия и семафоры, а также класс исключения, который может быть вызван операциями потоковой передачи (и некоторыми больше вещей). Он находится на верхней границе разумного размера (800 строк, включая пробелы и строки документации), а некоторые важные функции, связанные с потоками, такие как Queue, были помещены в отдельный модуль, тем не менее, это хороший пример того, какой максимальный объем функциональных возможностей все еще имеет смысл упаковать в один модуль.

person Alex Martelli    schedule 26.11.2009

Если вы хотите придерживаться своей системы с одним классом на файл (что логично, не поймите меня неправильно), вы можете сделать что-то вроде этого, чтобы избежать обращения к automobile.Automobile:

from automobile import Automobile
car = Automobile()

Однако, как упоминал cobbal, в Python довольно часто встречается более одного класса на файл. В любом случае, пока вы выбираете разумную систему и используете ее последовательно, я не думаю, что какие-либо пользователи Python будут на вас злиться :).

person Conrad Meyer    schedule 26.11.2009

Если вы исходите из точки зрения C ++, вы можете просматривать модули Python, похожие на .so или .dll. Да, они выглядят как исходные файлы, потому что python написан по сценариям, но на самом деле это загружаемые библиотеки с определенной функциональностью.

Другая метафора, которая может помочь, - вы можете рассматривать модули Python как пространства имен.

person mtvee    schedule 26.11.2009

В проекте среднего размера я обнаружил, что столкнулся с несколькими наборами тесно связанных классов. Некоторые из этих наборов теперь сгруппированы в файлы; например, все классы сети нижнего уровня находятся в одном модуле network. Однако некоторые из самых крупных классов были выделены в отдельный файл.

Возможно, лучший способ начать этот путь с истории по одному классу для каждого файла - это взять классы, которые вы обычно помещаете в один и тот же каталог, и вместо этого хранить их в одном файле. Если этот файл начинает выглядеть слишком большим, разделите его.

person eswald    schedule 26.11.2009

Как расплывчатое руководство: более 1 класса на файл является нормой для Python.

также см. Сколько классов Python я должен поместить в один файл?

person cobbal    schedule 26.11.2009