Соглашения об именах Python для модулей

102

У меня есть модуль, цель которого - определить класс под названием «перо». (и еще несколько связанных классов). Как мне вызвать сам модуль? "перо"? "нибмодуль"? Что-нибудь еще?

Рам Рахум
источник

Ответы:

110

Просто перо. Назовите класс Nib с заглавной буквы N. Дополнительные сведения об именах и другие советы по стилю см. В PEP 8 , руководстве по стилю Python.

Стефан202
источник
2
Следуют ли этому соглашению большинство проектов Python? Поскольку я заметил, что встроенные классы
написаны
4
Ваше наблюдение относительно встроенных типов правильное. Однако это, безусловно, исключения. Большинство других классов, определенных в стандартной библиотеке , пишутся с заглавной буквы.
Stephan202 03
2
Я думал, что это правильное соглашение, но в нем есть внутренняя проблема, по крайней мере, мне кажется. Скажем, у меня есть вызываемый класс Client, и, понятно, я часто делаю его экземпляры, которые хочу вызвать client. Но в соответствии с вашим соглашением имя модуля будет таким client, поэтому мне всегда приходилось называть свои экземпляры чем-то неестественным, например client_instance. Что вы думаете об этой проблеме?
Рэй
3
@Ray Но скажем, что соглашение должно было назвать модуль Client, тогда он будет конфликтовать с именем класса Client. Поскольку существует только 3 возможных варианта наименования ( client, Clientили CLIENT), всегда будет конфликт между двумя экземплярами, классами, модулями или константами. Я считаю, что меньше раз вы называете свой модуль так же, как экземпляр или константа, чем класс, и, следовательно, это лучшее соглашение об именах из других возможностей. Это также сделает импорт из модулей более читабельным, поскольку вы обычно импортируете классы и константы, а не переменные.
Тед Кляйн Бергман
2
Причина, по которой встроенные команды написаны в нижнем регистре, заключается в том, что они реализованы на C, а не на python.
Har
42

Я бы назвал это nib.py. И я бы также назвал класс Nib.

В более крупном проекте Python, над которым я работаю, у нас есть множество модулей, определяющих в основном один важный класс. Названия классов начинаются с заглавной буквы. Модули названы так же, как и класс в нижнем регистре. Это приводит к следующему импорту:

from nib import Nib
from foo import Foo
from spam.eggs import Eggs, FriedEggs

Это немного похоже на подражание Java. Один класс на файл. Но с дополнительной гибкостью, вы всегда можете добавить еще один класс в один файл, если это имеет смысл.

ринсвинд
источник
28

Я знаю, что мое решение не очень популярно с питонической точки зрения, но я предпочитаю использовать подход Java: один модуль-> один класс с модулем, названным как класс. Я понимаю причину стиля python, но мне не очень нравится иметь очень большой файл, содержащий множество классов. Мне сложно просматривать, несмотря на складывание.

Другая причина - это контроль версий: наличие большого файла означает, что ваши коммиты, как правило, сосредоточены на этом файле. Это потенциально может привести к большему количеству разрешаемых конфликтов. Вы также теряете дополнительную информацию журнала, что ваша фиксация изменяет определенные файлы (следовательно, включает определенные классы). Вместо этого вы видите модификацию файла модуля, только с комментарием фиксации, чтобы понять, какая модификация была сделана.

Подводя итог, если вы предпочитаете философию Python, ознакомьтесь с предложениями других сообщений. Если вы предпочитаете философию, подобную java, создайте Nib.py, содержащий класс Nib.

Стефано Борини
источник
2
Упомянутые проблемы вызваны ограничениями редактора и использованием инструментов контроля версий, а не языком или стилем программирования. Один класс на файл наносит ущерб структуре кода. Используйте spyderили аналогичный редактор, чтобы просмотреть сводку по классам, чтобы облегчить навигацию, и две панели с одним и тем же файлом, открытыми на обеих. Также прочтите PEP8. Python предназначен для написания Python, а Java для Java, но Python не для написания Java.
Иоаннис Филиппидис
6
@IoannisFilippidis: Если бы мне пришлось поместить все классы для модуля в один файл в размерах кода, которыми я обычно управляю, я бы даже не смог открыть файл, коллизии с другими коллегами взлетели бы до небес, и мой босс плюнул бы мне лицо (образно говоря, это все) за то, что его предложили. Подход с одним файлом не масштабируется, PEP-8 или нет.
Стефано Борини
3
@StefanoBorini: PEP8 не требует использования единого файла. Один класс на модуль и один файл на (кодовую единицу) - это две крайности из очень широкого спектра. Если вы видите неуправляемо большие размеры файлов с одним файлом на модуль, возможно, вам стоит подумать о пересмотре подхода к разбиению пакета на модули.
Чинталагири Шашанк
22

перо в порядке. Если есть сомнения, обратитесь к руководству по стилю Python.

Из PEP 8 :

Имена пакетов и модулей. Модули должны иметь короткие имена в нижнем регистре. Подчеркивание можно использовать в имени модуля, если это улучшает читаемость. Пакеты Python также должны иметь короткие имена, написанные строчными буквами, хотя использование подчеркиваний не рекомендуется.

Поскольку имена модулей сопоставляются с именами файлов, а некоторые файловые системы нечувствительны к регистру и обрезают длинные имена, важно, чтобы имена модулей были достаточно короткими - это не будет проблемой в Unix, но может быть проблема, когда код переносится на более старые версии Mac или Windows, или DOS.

Когда модуль расширения, написанный на C или C ++, имеет сопровождающий модуль Python, который обеспечивает интерфейс более высокого уровня (например, более объектно-ориентированный), модуль C / C ++ имеет начальное подчеркивание (например, _socket).

Thedz
источник
1
ммм ... это ударило меня в живот. Я использую префикс подчеркивания в пакетах / модулях для чего-то совершенно другого (предназначена ссылка на монти-питон).
Стефано Борини
0

Из PEP-8: Имена пакетов и модулей :

Модули должны иметь короткие имена, написанные строчными буквами. Подчеркивание можно использовать в имени модуля, если это улучшает читаемость.

Пакеты Python также должны иметь короткие имена, написанные строчными буквами, хотя использование подчеркиваний не рекомендуется.

Когда модуль расширения, написанный на C или C ++, имеет сопутствующий модуль Python, который обеспечивает интерфейс более высокого уровня (например, более объектно-ориентированный), модуль C / C ++ имеет начальное подчеркивание (например, _socket).

Эхсан
источник
-3

Модуль foo в Python будет эквивалентом файла класса Foo в Java

или

Модуль foobar в Python будет эквивалентом файла класса FooBar в Java.

Одед Брейнер
источник