Python не делает этого, потому что вы сталкиваетесь с проблемой - кому принадлежит пакет com, из которого почти все остальное является подпакетом? Метод Python для определения иерархии пакетов (через иерархию файловой системы) не совсем подходит для этого соглашения. Java может обойтись без этого, потому что иерархия пакетов определяется структурой строковых литералов, передаваемых в оператор 'package', поэтому нигде не нужно явно указывать пакет 'com'.
Существует также вопрос о том, что делать, если вы хотите публично выпустить пакет, но у вас нет доменного имени, подходящего для привязки к имени пакета, или если вы в конечном итоге изменили (или потеряли) свое доменное имя для некоторая причина. (Нужны ли последующим обновлениям другое имя пакета? Откуда вы знаете, что com.nifty_consultants.nifty_utility является более новой версией com.joe_blow_software.nifty_utility? Или, наоборот, откуда вы знаете, что это не новее версия? Если вы пропустили продление своего домена, а имя получено кем-то из доменных имен, и кто-то еще покупает это имя у них и хочет публично выпустить пакеты программного обеспечения, будут ли они тогда использовать то же имя, которое вы уже использовали?)
Доменные имена и названия пакетов программ, как мне кажется, решают две совершенно разные проблемы и имеют совершенно разные осложняющие факторы. Мне лично не нравится соглашение Java, потому что (ИМХО) оно нарушает разделение интересов. Избегать коллизий пространства имен - это хорошо, но я ненавижу мысль о том, что пространство имен моего программного обеспечения определяется (и зависит от) взаимодействием отдела маркетинга с какой-либо сторонней бюрократией.
Чтобы прояснить мою точку зрения, в ответ на комментарий JeeBee: В Python пакет представляет собой каталог, содержащий файл __init__.py
(и предположительно один или несколько файлов модулей). Иерархия пакетов требует, чтобы каждый пакет более высокого уровня был полным, законным пакетом. Если два пакета (особенно от разных поставщиков, но даже пакеты, не связанные напрямую с одним и тем же поставщиком) имеют общее имя пакета верхнего уровня, независимо от того, является ли это имя «com» или «web» или «utils» или что-то еще, каждый из них должен предоставить __init__.py
для этого пакета верхнего уровня. Мы также должны предположить, что эти пакеты, вероятно, будут установлены в том же месте в дереве каталогов, то есть site-packages / [pkg] / [subpkg]. Таким образом, файловая система обеспечивает, что существует только один [pkg]/__init__.py
- так, кто выигрывает? На этот вопрос нет (и не может быть) общего ответа. Мы также не можем разумно объединить два файла. Поскольку мы не можем знать, что может понадобиться другому пакету в этом __init__.py
, нельзя предполагать, что подпакеты, совместно использующие пакет верхнего уровня, будут работать, если оба они установлены, если они специально не написаны для совместимости друг с другом (по крайней мере, в это один файл). Это было бы кошмаром для дистрибутива и в значительной степени обесценило бы весь смысл вложенных пакетов. Это не характерно для иерархий пакетов обратного доменного имени, хотя они предоставляют наиболее очевидный плохой пример и (IMO) философски сомнительны - это действительно практическая проблема общих пакетов верхнего уровня, а не философские вопросы, которые моя главная проблема здесь.
(С другой стороны, большой пакет, использующий подпакеты для лучшей организации, является отличной идеей, поскольку эти подпакеты специально предназначены для совместной работы и совместной работы. Это не так часто встречается в Python, тем не менее, поскольку для одного концептуального пакета не требуется большого количества файлов, необходим дополнительный уровень организации.)