Яка умова іменування в Python для імен змінних та функцій?


772

Виходячи з фону C #, умовами іменування змінних та імен методів зазвичай є camelCase або PascalCase:

// C# example
string thisIsMyVariable = "a"
public void ThisIsMyMethod()

У Python я бачив вищезазначене, але також бачив підкреслення:

# python example
this_is_my_variable = 'a'
def this_is_my_function():

Чи є більш кращий, остаточний стиль кодування для Python?

Відповіді:


867

Див. Python PEP 8: Імена функцій та змінних :

Назви функцій мають бути малими літерами зі словами, розділеними підкресленнями як це необхідно для поліпшення читабельності.

Імена змінних дотримуються тієї ж умови, що і назви функцій.

Змішана дозволена лише в контекстах, де це вже переважаючий стиль (наприклад, threading.py ), щоб зберегти зворотну сумісність.


127
PEP = Пропозиція щодо вдосконалення Python.
Пітер Мортенсен

8
@RickyRobinson Який редактор коду, який умер за мозком, ви використовуєте, що не знає, що підкреслення продовжує слово? Багато безкоштовних, які роблять. Я використовую Notepad ++, якщо IDE недоступний. Для цього можна завантажити шаблон для редагування python. (Інші можуть порекомендувати ще корисніші безкоштовні завантаження.)
ToolmakerSteve

57
Одним із випадків стилю, що підкреслюється, є те, що ви можете краще використовувати однобуквені слова. Для (досить нерозумно) , наприклад, findMeAClassце може бути , потворніше find_me_a_class.
heltonbiker

9
Я вважаю, що конвенція імен змінних великі регістри не підходить для наукових обчислень, де часто трапляються відомі константи, тензори тощо, які позначаються великими літерами.
andreasdr

12
@rr PEP8 - "Посібник зі стилів" і описує себе як Конвенцію, а не стандарт. Це також чітко пояснює причини не завжди дотримуватися цих "правил".
Тахаан

710

Керівництво Стиль Google Python має наступну угоду:

module_name, package_name , ClassName, method_name, ExceptionName, function_name, GLOBAL_CONSTANT_NAME, global_var_name, instance_var_name, function_parameter_name, local_var_name.

Аналогічну схему іменування слід застосувати до а CLASS_CONSTANT_NAME


37
а) Я люблю приклади - дякую. б) Неприваблива суміш CamelCase і підкреслення? Але: Будучи новинкою в Python та його більш гнучкої моделі даних, я думаю, що за посібником Google чітко замислюються ...
Меттью Корнелл

19
@MatthewCornell змішування не є поганим, якщо ви дотримуєтесь цього. Це фактично полегшує читабельність, якщо ви знаєте, що функції мають підкреслення, а класи - ні.
Пітікос

1
@MatthewCornell Я б не припускав, що це має щось спільне з python. Фактично виконайте довільні стандарти краси і не зможете скласти їх, якщо не дотримуватися, наприклад, їх фігурної дужки. По суті, це закрутка кісток щодо того, чи насправді хтось ретельно продумав, чи просто дуже любив те, як вони роблять справи.
Парфянський розстріл

Чи вважаєте ви постійним статичним атрибутом GLOBAL_CONSTANT_NAME? Це не зовсім глобально, оскільки є в обсязі класу.
Джеймс Т.

потім заходить property... можливо, справа в тому, який предмет претендує на себе, а не в тому, що він є насправді
joelb

240

Девід Goodger (в «Code Подібно Pythonista» тут ) описує PEP 8 рекомендацій наступним чином :

  • joined_lower для функцій, методів, атрибутів, змінних

  • joined_lowerабо ALL_CAPSдля констант

  • StudlyCaps для занять

  • camelCase лише відповідно до попередніх конвенцій


3
+1 наочні приклади. Хоча я не міг бачити , де PEP8 пропонує joined_lowerдля постійних , тільки «всіх заголовних букв підкреслення відокремлюючи слова». Цікаво також про нову функцію enum .
Боб Штейн

1
StudlyCaps for classesє прекрасним універсальним правилом для занять майже на всіх мовах. Тоді чому деякі вбудовані пітонські класи (наприклад, datetime.datetimeне дотримуються цієї конвенції?
Prahlad Yeri

3
@PrahladYeri: На жаль, unittest.TestCase.assertEqualі друзі не дотримуються конвенції snake_case. Правда полягає в тому, що частини стандартної бібліотеки Python були розроблені ще до того, як конвенції затверділи, і ми зараз дотримуємося їх.
wchargin

3
CamelCase є заплутаним, тому що деякі кажуть, що це "camelCase" (також відомий як "змішаний"), а деякі кажуть, що це "CamelCase" (також відомий як "StudlyCaps"). Наприклад, PEP згадує "CamelCase", тоді як ви згадуєте "camelCase".
Pro Q

ваше посилання тут мертве, можливо, його слід замінити чимось на зразок david.goodger.org/projects/pycon/2007/idiomatic
Вовк

42

Як визнає посібник зі стилів для Python Code ,

Конвенції про іменування бібліотеки Python трохи заплутані, тому ми ніколи не будемо цілком узгоджувати це

Зауважте, що це стосується лише стандартної бібліотеки Python . Якщо вони не можуть досягти такої послідовності, то навряд чи є велика надія на загальне дотримання конвенції для всіх кодів Python?

З цього і обговорення тут, я б зробив висновок, що це не жахливий гріх, якщо можна продовжувати використовувати, наприклад, Java або C # 's (чіткі і чітко встановлені) умови іменування змінних та функцій при переході на Python. Звичайно, маючи на увазі, що найкраще дотримуватися того стилю, який склався для кодової бази / проекту / команди. Як вказує керівництво по стилю Python, внутрішня узгодженість найбільше значення має .

Сміливо звільняйте мене як єретика. :-) Як і ОП, я все ще не "пітоніст".


32

Існує PEP 8 , як показують інші відповіді, але PEP 8 є лише стилістичним довідником для стандартної бібліотеки, і це тільки приймається Євангеліє в ньому. Одне з найчастіших відхилень PEP 8 для інших фрагментів коду - це називання змінної, спеціально для методів. Не існує єдиного стилю переважаючого, хоча враховуючи об'єм коду, який використовує змішануCase, якби проводити суворий перепис, мабуть, вийде версія PEP 8 зі змішанимCase. Інших відхилень від PEP 8 мало, що досить часто.


9
Це могло бути правдою у08 році, коли на це відповіли, але в наші дні майже всі основні бібліотеки використовують конвенції про іменування PEP 8.
Тайн Брімхолл

28

Як уже згадувалося, PEP 8 говорить про використання lower_case_with_underscores для змінних, методів та функцій.

Я вважаю за краще використовувати lower_case_with_underscoresдля змінних, а також mixedCaseдля методів і функцій, робить код більш явним і читабельним. Таким чином, слідування дзену Python "явне краще, ніж неявне" і "Читання рахунків"


3
+1 Я перемикаю ці два (я використовую змішану зміну для змінних), але маючи все більш чітке подібне, що допомагає зрозуміти негайно, з чим ви маєте справу, тим більше що ви можете передавати функції.
Xiong Chiamiov

2
Хоча "читабельність" є високо суб'єктивною. Я вважаю методи з підкресленням більш зрозумілими.
Пітікос

Вашою перевагою була моя первісна інтуїція, що випливала з багатьох років розвитку Java. Мені подобається використовувати _ для змінних, але з очей це просто виглядає мені кумедно для функцій та методів.
Михайло Щепаняк

21

далі на те, що відповів @JohnTESlade. Посібник зі стилю python від Google має кілька акуратних рекомендацій,

Імена, яких слід уникати

  • поодинокі імена символів, за винятком лічильників чи ітераторів
  • тире (-) у будь-якій назві пакета / модуля
  • \__double_leading_and_trailing_underscore__ names (зарезервовано Python)

Конвенція про іменування

  • "Внутрішній" означає внутрішній модуль або захищений або приватний в межах класу.
  • Попередження єдиного підкреслення (_) має деяку підтримку захисту змінних модулів та функцій (не входить до імпорту * з). Попередження подвійного підкреслення (__) до змінної екземпляра або методу ефективно служить для того, щоб змінна чи метод були приватними для свого класу (використовуючи керування іменами).
  • Розміщуйте пов’язані класи та функції вищого рівня разом у модулі. На відміну від Java, немає необхідності обмежувати себе одним класом на модуль.
  • Використовувати CapWordsдля назв класів, але lower_with_under.pyдля назв модулів. Хоча існує чимало існуючих модулів з назвою CapWords.py, це зараз відлякує, оскільки це заплутано, коли модуль буде іменований назви класу. ("зачекайте - я написав import StringIOчи from StringIO import StringIO?")

Настанови, що випливають з Рекомендацій Гуйдо введіть тут опис зображення


17

Більшість людей-пітонів вважають за краще підкреслювати, але навіть якщо я вже більше 5 років використовую python, я все ще не люблю їх. Вони просто негарно виглядають на мені, але, можливо, це все Ява в моїй голові.

Я просто як CamelCase краще , так як він краще підходить тим , як класи по імені, він відчуває себе більш логічно мати SomeClass.doSomething()чим SomeClass.do_something(). Якщо озирнутися в глобальному індексі модуля в python, ви знайдете і те, і інше, що пов'язано з тим, що це колекція бібліотек з різних джерел, які зростали понаднормово, а не те, що було розроблено однією компанією, як Sun, із суворими правилами кодування . Я б сказав, що підсумок: Використовуйте все, що вам більше подобається, це лише питання особистого смаку.


10
Я походжу з передумови Java, і я вважаю, що підкреслює багатослівний та непривабливий характер, лише останнім є думка. Іменування в деякому відношенні є балансом між читабельністю та стислістю. Unix заходить занадто далеко, але його en.wikipedia.org/wiki/Domain-specific_language обмежений. CamelCase читається завдяки кришкам, але не має додаткових ознак. 2c
Меттью Корнелл

2
Для мене підкреслення є привабливими у функціях / методах, оскільки я бачу кожне підкреслення як роздільник віртуального (у голові) простору імен. Таким чином , я можу легко дізнатися , як назвати мої нові функції / методи: make_xpath_predicate, make_xpath_expr, make_html_header,make_html_footer
Pithikos

3
Ви не (звичайно) дзвоните SomeClass.doSomething()(статичні методи, як правило, рідкісні), як правило, дзвонятьan_instance.do_something()
Дейв,

15

Особисто я намагаюся використовувати CamelCase для класів, методів та функцій змішаного казу. Змінні зазвичай підкреслюються підкресленням (коли я можу згадати). Таким чином я можу з першого погляду сказати, що саме я дзвоню, а не все, що виглядає однаково.


15
Справа верблюда починається з малої літери IIRC типу "camelCase".
UnkwnTech

11
Я думаю, що кристалічна решетка мала це правильно - принаймні, його використання відповідає використанню в PEP8 (CamelCase та змішане).
Jarrett

1
@UnkwnTech Термін для FirstLetterUpper іноді називають PascalCase
SurpriseDog

CamelCase чи camelCase? просто цікаво.
Суміт Похрель

11

Про це є стаття: http://www.cs.kent.edu/~jmaletic/papers/ICPC2010-CamelCaseUnderScoreClouds.pdf

TL; DR Це говорить про те, що snake_case легше читати, ніж camelCase. Ось чому сучасні мови використовують (або повинні вживати) змію, де тільки можуть.


9
Цікаво, що він також говорить: "Результати цього дослідження не обов'язково стосуватимуться ідентифікаторів, вбудованих у вихідний код. Цілком можливо, що закріплені ідентифікатори можуть діяти як кращий елемент гештальта при вбудованому в структуру програмування".
rob3c

2

Стиль кодування, як правило, є частиною внутрішніх стандартів організації / стандартів конвенції, але я думаю, що загалом у python найчастіше зустрічається стиль all_lower_case_underscore_separator (також його називають snake_case).


0

Я особисто використовую конвенції про іменування Java під час розробки інших мов програмування, оскільки це послідовно і легко дотримуватися. Таким чином, я не безперервно борюся за те, які конвенції використовувати, які не повинні бути найважчою частиною мого проекту!


Я дещо згоден. Якщо мова X - лише невелика кількість проекту, контекстне перемикання форматування тексту може бути тягарем. Основна гикавка полягає в тому, що бібліотеки матимуть дзвінки в одному стилі ( library_function(my_arg)).
Лан

-2

Як правило, слід дотримуватися умов, які використовуються в стандартній бібліотеці мови.

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