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

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


person Ram Rachum    schedule 02.04.2009    source источник


Ответы (5)


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

person Stephan202    schedule 02.04.2009
comment
Большинство проектов Python следуют этому соглашению? Поскольку я заметил, что встроенные классы написаны строчными буквами, например. список, строка и т. д. - person Ram Rachum; 03.04.2009
comment
Вы наблюдаете w.r.t. встроенные типы верны. Однако это явные исключения. Большинство других классов, определенных в стандартной библиотеке, написываются с заглавной буквы. - person Stephan202; 03.04.2009
comment
Я думал, что это правильное соглашение, но с ним есть неотъемлемая проблема, по крайней мере, мне кажется. Скажем, у меня есть класс с именем Client, и понятно, что я часто создаю его экземпляры, которые хочу назвать client. Но согласно вашему соглашению, имя модуля будет client, поэтому мне всегда приходилось называть свои экземпляры чем-то неестественным, например client_instance. Что вы думаете об этой проблеме? - person Ray; 01.06.2016
comment
@Ray Но скажем, по соглашению модуль должен называться Client, тогда он будет конфликтовать с именем класса Client. Поскольку существует только 3 возможных варианта именования (client, Client или CLIENT), всегда будет конфликт между двумя экземплярами, классами, модулями или константами. Я считаю, что вы реже называете свой модуль так же, как экземпляр или константу, чем класс, и, следовательно, это лучшее соглашение об именах других возможностей. Это также сделает импорт из модулей более читабельным, поскольку обычно вы импортируете классы и константы, а не переменные. - person Ted Klein Bergman; 08.11.2016
comment
Причина, по которой встроенные функции написаны строчными буквами, заключается в том, что они реализованы на C, а не на python. - person Har; 21.04.2017
comment
@Har PEP 8: соглашение об именах для функций может использоваться вместо этого в случаях, когда интерфейс задокументирован и используется в основном как вызываемый. - person Alan; 20.01.2019

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

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

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

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

person rincewind    schedule 02.04.2009

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

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

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

person Stefano Borini    schedule 02.04.2009
comment
Упомянутые проблемы вызваны ограничениями в редакторе и в использовании инструментов контроля версий, а не в языке или стиле программирования. Один класс на файл вреден для структуры кода. Используйте spyder или аналогичный редактор, чтобы просмотреть сводку ваших классов, чтобы облегчить навигацию, и две панели с одним и тем же файлом, открытым на обеих. Также, пожалуйста, прочитайте PEP8. Python предназначен для написания Python, а Java — для Java, но Python не для написания Java. - person Ioannis Filippidis; 08.04.2015
comment
@IoannisFilippidis: Если бы мне пришлось поместить все классы для модуля в один файл с размерами кода, с которыми я обычно справляюсь, я бы даже не смог открыть файл, коллизии с другими коллегами взлетели бы до небес, а мой босс плюнул бы мне в голову. лицо (фигурально, вот и все) за предложение. Подход с одним файлом не масштабируется, независимо от того, PEP-8 или нет. - person Stefano Borini; 11.04.2015
comment
@StefanoBorini: PEP8 не требует подхода с одним файлом. Один класс на модуль и один файл на (единицу кода) — две крайности очень широкого спектра. Если вы видите неуправляемо большие размеры файлов с одним файлом на модуль, вам, возможно, следует подумать о пересмотре вашего подхода к разбиению пакета на модули. - person Chintalagiri Shashank; 27.09.2015

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

Из PEP 8:

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

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

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

person thedz    schedule 02.04.2009

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

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

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

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

person Ehsan    schedule 13.08.2019