Конвенції про іменування Python для модулів


102

У мене є модуль, мета якого - визначити клас під назвою "nib". (і кілька пов'язаних класів теж.) Як я повинен викликати сам модуль? "гриб"? "нібмодуль"? Щось іще?

Відповіді:


110

Просто гризти. Назвіть клас Nib з великою літерою N. Детальніше про назви конвенцій та інші поради щодо стилів див. У PEP 8 , посібнику зі стилю Python.


2
Чи дотримуються більшість проектів Python цієї конвенції? Тому що я помічаю, що вбудовані класи є малі, наприклад, список, рядок тощо.
Рам Рахум

4
Ви спостерігаєте, що WR вбудовані типи є правильними. Це, безумовно, винятки. Більшість інших класів, визначених у стандартній бібліотеці, мають великі літери.
Stephan202

2
Я думав, що це правильна конвенція, але з нею є притаманна проблема, принаймні мені це здається. Скажімо, у мене є клас, який називається Client, і, зрозуміло, я часто роблю його екземпляри, які я хочу зателефонувати client. Але згідно з вашою умовою, назва модуля була б client, і тому я завжди повинен був би називати свої екземпляри чимось неприродним, як client_instance. Що ви думаєте про цю проблему?
Рей

3
@Ray Але скажімо, що умова полягала в тому, щоб назвати модуль Client, тоді воно зіткнеться з назвою класу Client. Оскільки існує тільки 3 можна називати варіанти ( client, Clientабо CLIENT) завжди буде зіткнення двох примірників, класів, модулів або констант. Я вважаю, що ви рідше називаєте свій модуль тим самим, як екземпляр або константа, ніж клас, і тому краще узгодження імен інших можливостей. Це також зробить імпорт з модулів більш читабельним, оскільки ви, як правило, імпортуєте класи та константи, а не змінні.
Тед Кляйн Бергман

2
Причина, чому вбудовані малі регістри - це те, що вони реалізовані в C, а не в python.
Хар

41

Я б назвав це nib.py. І я б також назвав клас Nib.

У більшому проекті пітона, над яким я працюю, ми маємо безліч модулів, що визначають в основному один важливий клас. Класи названі, починаючи з великої літери. Модулі названі як клас у нижньому регістрі. Це призводить до імпорту на зразок наступного:

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

Це трохи схоже на емуляцію способу Java. Один клас на файл. Але, маючи додаткову гнучкість, ви завжди можете додати ще один клас до одного файлу, якщо це має сенс.


27

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

Ще одна причина - контроль над версіями: наявність великого файлу означає, що ваші зобов'язання зосереджуються на цьому файлі. Це може призвести до вирішення більшої кількості конфліктів. Ви також втрачаєте додаткову інформацію журналу, що ваш комітет модифікує конкретні файли (тому включаючи конкретні класи). Натомість ви бачите модифікацію файлу модуля, лише зазначаючи коментар, щоб зрозуміти, яку модифікацію було зроблено.

Підводячи підсумки, якщо ви віддаєте перевагу філософії пітона, перейдіть до пропозицій інших постів. Якщо ви віддаєте перевагу філософії, схожі на java, створіть Nib.py, що містить клас Nib.


1
Згадані проблеми викликані обмеженнями в редакторі та у використанні засобів управління версіями, а не мовою чи стилем програмування. Один клас на файл згубно впливає на структуру коду. Використовуйте spyderчи подібний редактор, щоб переглянути підсумки своїх класів, щоб допомогти навігації, і дві області з тим самим файлом відкриті на обох. Також прочитайте PEP8. Python призначений для написання Python, а Java для Java, але Python не для написання Java.
Іоанніс Філіппідіс

5
@ IoannisFilippidis: Якби мені довелося розміщувати всі класи для модуля в одному файлі з розмірами коду, яким я зазвичай керую, я навіть не змогла би відкрити файл, зіткнення з іншими колегами зростали б швидкими темпами, і мій начальник плюнув би на мене обличчя (образно кажучи, це все) за його пропозицію. Підхід одного файлу не масштабує, PEP-8 чи ні.
Стефано Борині

2
@StefanoBorini: PEP8 не вимагає підходу до єдиного файлу. Один клас на модуль і один файл на (одиницю коду) - дві крайності дуже широкого спектру. Якщо ви бачите невміло великі розміри файлів з одним файлом на модуль, вам, можливо, варто подумати про перегляд підходу до розбивки пакету на модулі.
Чінталагірі Шашанк

22

перо добре. Якщо ви сумніваєтесь, зверніться до посібника зі стилю Python.

Від PEP 8 :

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

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

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


1
хм ... це б'є мене в живіт. Я використовую префікс підкреслення в пакетах / модулях для чогось зовсім іншого (призначений для монті python).
Стефано Борині

0

Від PEP-8: Назви пакетів та модулів :

Модулі повинні мати короткі, малі імена. Підкреслення можна використовувати у назві модуля, якщо це покращує читабельність.

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

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


-3

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

або

модуль foobar в python був би еквівалентний файлу класу FooBar на Java

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.