Какое соглашение об именах в Python для имен переменных и функций?

774

Исходя из фона 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?

луч
источник

Ответы:

868

Смотрите Python PEP 8: имена функций и переменных :

Имена функций должны быть строчными, слова должны быть разделены подчеркиванием чтобы улучшить читаемость.

Имена переменных следуют тому же соглашению, что и имена функций.

mixedCase допускается только в тех случаях, когда это уже преобладающий стиль (например, threading.py ), чтобы сохранить обратную совместимость.

С. Лотт
источник
127
PEP = Предложение по улучшению Python.
Питер Мортенсен
8
@RickyRobinson Какой редактор кода вы используете, который не знает, что подчеркивание продолжает слово? Много бесплатных, которые делают. Я использую Notepad ++, если IDE недоступна. Для этого можете скачать шаблон для редактирования на питоне. (Другие могут порекомендовать еще больше полезных бесплатных загрузок.)
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

JohnTESlade
источник
37
а) я люблю примеры - спасибо. б) Непривлекательная смесь CamelCase и подчеркивания? Но: будучи новичком в Python и его более гибкой модели данных, я уверен, что за руководством Google стоит серьезная мысль ...
Мэтью Корнелл,
19
@MatthewCornell смешивание не плохо, если вы придерживаетесь его. На самом деле это делает читабельность проще, если вы знаете, что у функций есть подчеркивания, а у классов нет.
Питикос
1
@ MatthewCornell Я бы не подумал, что это как-то связано с питоном. Go фактически применяет произвольные стандарты красоты и не сможет скомпилироваться, если вы не будете придерживаться, например, их соглашения о фигурных скобках. По сути, это бросок костей в отношении того, задумывался ли кто-то на самом деле о тщательной мысли или просто действительно любил то, как они делают вещи.
Парфянский выстрел
Считаете ли вы постоянный статический атрибут GLOBAL_CONSTANT_NAME? Это не совсем глобально, так как это входит в сферу деятельности класса.
Джеймс Т.
затем входит property... возможно, дело в том, какой предмет притворяется, а не в том, чем он является на самом деле
joelb
240

Дэвид Гуджер (в «Коде как Pythonista» здесь ) описывает рекомендации PEP 8 следующим образом:

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

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

  • StudlyCaps для занятий

  • camelCase только в соответствии с ранее существовавшими соглашениями

неокантованный
источник
3
+1 наглядные примеры. Хотя я не мог видеть , где PEP8 предлагает joined_lowerдля постоянных , только «всех заглавных букв подчеркивания отделяя слова». Любопытно также о новой функции enum .
Боб Стейн
1
StudlyCaps for classesотличное универсальное правило для занятий практически на всех языках. Тогда почему некоторые встроенные в Python классы (например datetime.datetime, не соблюдающие это соглашение?
Прахлад Ери
3
@PrahladYeri: К сожалению, unittest.TestCase.assertEqualи друзья тоже не соблюдают соглашение snake_case. Правда состоит в том, что части стандартной библиотеки Python были разработаны до того, как соглашения укрепились, и теперь мы застряли с ними.
wchargin
3
CamelCase сбивает с толку, потому что некоторые люди говорят, что это «camelCase» (также известный как «mixedCase»), а некоторые люди говорят, что это «CamelCase» (также известный как «StudlyCaps»). Например, PEP упоминает «CamelCase», а вы упоминаете «CamelCase».
Pro Q
Ваша ссылка здесь мертва, возможно, ее следует заменить чем-то вроде david.goodger.org/projects/pycon/2007/idiomatic
Wolf
42

Как признается в Руководстве по стилю для кода Python ,

Соглашения об именах библиотеки Python немного беспорядочные, поэтому мы никогда не получим это полностью согласованным

Обратите внимание, что это относится только к стандартной библиотеке Python . Если они не могут добиться такой последовательности, то вряд ли можно надеяться на общепринятую конвенцию для всех. кода Python, есть?

Из этого и из обсуждения здесь я бы сделал вывод, что это не страшный грех, если при переходе на Python продолжать использовать, например, Java или C # (четкие и устоявшиеся) соглашения об именах переменных и функций. Имея в виду, конечно, что лучше всего придерживаться того, какой бы ни был преобладающий стиль для кодовой базы / проекта / команды. Как указывает руководство по стилю Python, внутренняя согласованность важнее всего.

Не стесняйтесь уволить меня как еретика. :-) Как и OP, я не "Pythonista", во всяком случае, пока.

Jonik
источник
32

Существует PEP 8 , как показывают другие ответы, но PEP 8 - это только руководство по стилю для стандартной библиотеки, и в нем оно воспринимается только как Евангелие. Одним из наиболее частых отклонений PEP 8 для других частей кода является именование переменных, особенно для методов. Единого преобладающего стиля не существует, хотя, учитывая объем кода, который использует mixedCase, если провести строгую перепись, возможно, получится версия PEP 8 с mixedCase. Есть небольшое другое отклонение от PEP 8, которое является столь же распространенным.

Томас Воутерс
источник
9
Возможно, это было правдой в 2008 году, когда на этот вопрос был дан ответ, но в настоящее время почти все основные библиотеки используют соглашения об именах PEP 8.
Тейн Бримхолл
29

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

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

claytron
источник
3
+1 Я переключаю эти два (я использую mixedCase для переменных), но наличие всего более отчетливого помогает сразу понять, с чем вы имеете дело, тем более что вы можете передавать функции.
Xiong Chiamiov
2
Хотя «Читаемость» очень субъективна. Я считаю методы с подчеркиванием более читабельными.
Питикос
Ваше предпочтение было моей первоначальной интуицией, пришедшей из многих лет разработки Java. Мне нравится использовать _ для переменных, но на первый взгляд для функций и методов это выглядит немного забавно.
Михаил Щепаняк,
21

далее на что @JohnTESlade ответил. Руководство по стилю Google Python содержит несколько довольно аккуратных рекомендаций,

Имена, которых следует избегать

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

Соглашение об именовании

  • «Внутренний» означает внутренний для модуля или защищенный или частный в классе.
  • Добавление одного подчеркивания (_) имеет некоторую поддержку для защиты переменных и функций модуля (не входит в import * from). Добавление двойного подчеркивания (__) к переменной или методу экземпляра эффективно делает переменную или метод приватными для своего класса (используя искажение имени).
  • Поместите связанные классы и функции верхнего уровня вместе в модуль. В отличие от Java, нет необходимости ограничивать себя одним классом на модуль.
  • Используйте CapWordsдля имен классов, но lower_with_under.pyдля имен модулей. Несмотря на то, что существует много названных модулей CapWords.py, это не рекомендуется, потому что вводит в заблуждение, когда модуль назван в честь класса. («подожди - я написал import StringIOили from StringIO import StringIO?»)

Руководства, основанные на рекомендациях Гвидо введите описание изображения здесь

Суфиян Гори
источник
17

Большинство людей, предпочитающих python, предпочитают подчеркивание, но даже я использую python уже более 5 лет, но я до сих пор не люблю их. Они просто выглядят мне некрасиво, но, возможно, это все, что связано с Java в моей голове.

Мне просто нравится 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 для классов, методов и функций mixedCase. Переменные обычно разделяются подчеркиванием (когда я могу вспомнить). Таким образом, я могу сразу увидеть, что именно я звоню, а не все выглядит одинаково.

crystalattice
источник
15
Случай с верблюдом начинается со строчной буквы IIRC, например, «camelCase».
UnkwnTech
11
Я думаю, что у Crystalattice это было правильно - по крайней мере, его использование соответствует использованию в PEP8 (CamelCase и mixedCase).
Джаррет
1
@UnkwnTech Термин для FirstLetterUpper иногда называется PascalCase
SurpriseDog
CamelCase или CamelCase? просто интересуюсь.
Сумит Похрел
11

Об этом есть статья: http://www.cs.kent.edu/~jmaletic/papers/ICPC2010-CamelCaseUnderScoreClouds.pdf

TL; DR Это говорит о том, что snake_case более читабелен, чем camelCase. Вот почему современные языки используют (или должны использовать) змею везде, где могут.

alebian
источник
9
Интересно, что в нем также говорится: «Результаты этого исследования могут не обязательно применяться к идентификаторам, встроенным в исходный код. Вполне возможно, что идентификаторы на верблюдах могут выступать в качестве лучшего элемента гештальта при внедрении в программные конструкции».
rob3c
2

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

fuentesjr
источник
0

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

bradylange
источник
Я несколько согласен. Если язык X представляет собой лишь небольшую часть проекта, переключение контекста форматирования текста может быть бременем. Основной недостаток заключается в том, что библиотеки будут иметь вызовы в одном стиле ( library_function(my_arg)).
Лан
-2

Как правило, следуют соглашениям, используемым в стандартной библиотеке языка.

yfeldblum
источник