Нотация Python?

Я только начал использовать Python и думал о том, какую нотацию мне следует использовать. Я прочитал руководство PEP 8 по нотации для Python и согласен с большинством вещей, кроме имен функций (которые я предпочитаю в стиле MixedCase).

В C++ я использую модифицированную версию венгерской нотации, в которой я не включаю информацию о типе, а только об области действия переменной (например, lVariable для локальной переменной и mVariable для переменной-члена класса, g для глобальной, s для статики, in для ввода функции и out для вывода функции.)

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

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


person levesque    schedule 21.07.2009    source источник
comment
Ну, это проект с открытым исходным кодом. И теперь я в значительной степени решил это (спасибо за все ответы, кстати). Я буду придерживаться PEP-8, за исключением underscore_separated_stuff; Я просто не могу с этим справиться :Р   -  person levesque    schedule 22.07.2009


Ответы (6)


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

FTFY.

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

Это также не так необходимо из-за того, как работает сам Python. Например, вам никогда не понадобится форма mVariable, потому что в Python это очевидно:

class Example(object):
    def__init__(self):
        self.my_member_var = "Hello"

    def sample(self):
        print self.my_member_var

e = Example()
e.sample()
print e.my_member_var

Независимо от того, как вы обращаетесь к переменной-члену (используя self.foo или myinstance.foo), всегда ясно, что это член.

Другие случаи могут быть не столь болезненно очевидными, но если ваш код недостаточно прост, чтобы читатель мог помнить, что «переменная 'names' является параметром» при чтении функции, вы, вероятно, делаете что-то не так.

person Steve Losh    schedule 21.07.2009
comment
+1: отказаться от венгерской нотации. Лишние буквы теряются. Просто назовите переменные с их назначением — забудьте о области действия, типе, размере, весе, цвете или любых других атрибутах. - person S.Lott; 22.07.2009
comment
Это также рекомендуется в руководстве по стилю Google: google-styleguide.googlecode.com/svn/trunk. /pyguide.html - person Otto Allmendinger; 08.10.2009

Используйте PEP-8. Он почти универсален в мире Python.

person Marius Gedminas    schedule 21.07.2009
comment
Пожалуйста, пожалуйста, пожалуйста, сделайте это. Весь смысл столь раннего определения стандарта в том, чтобы люди следовали ему. Вам действительно нужно идти по касательной и называть вещи по-своему? Я сделал это сам, но быстро передумал, когда люди в IRC вообще не стали смотреть на мой код. - person jkp; 22.07.2009

Я нарушаю PEP8 в своем коде. Я использую:

  • нижний регистрCamelCase для методов и функций
  • _prefixedWithUnderscoreLowercaseCamelCase для «частных» методов
  • underscore_spaced для переменных (любых)
  • _prefixed_with_underscore_variables для «частных» переменных (атрибутов)
  • CapitalizedCamelCase для классов и модулей (хотя я перехожу к модулям в нижнем регистре)

Мне никогда не нравилась венгерская нотация. Имя переменной должно быть простым и кратким, предоставлять достаточно информации, чтобы было ясно, где (в какой области) она используется и какова ее цель, легко читаемая, связанная со значением того, на что она ссылается, а не с ее технической чепухой ( например тип).

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

  • в C++ и Java традиционно используется CapitalizedCamel для классов и строчных букв Camel для функций-членов.
  • Я работал над кодовой базой, в которой префикс подчеркивания использовался для обозначения частного, но не такого уж частного. Мы не хотели связываться с искажением имени Python (двойное подчеркивание). Это дало нам возможность немного нарушить формальности и посмотреть внутреннее состояние класса во время модульного тестирования.
person Stefano Borini    schedule 21.07.2009

Существует удобный скрипт соответствия pep-8, который вы можете запустить для своего кода:

http://github.com/cburroughs/pep8.py/tree/master

person Thomas Schreiber    schedule 21.07.2009

Это будет зависеть от проекта и целевой аудитории.

Если вы создаете приложение/плагин/библиотеку с открытым исходным кодом, придерживайтесь рекомендаций PEP.

Если это проект для вашей компании, придерживайтесь принятых в компании соглашений или чего-то подобного.

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

Я надеюсь это имеет смысл.

person Alan    schedule 21.07.2009

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

Например, 4 пробела вместо 1 вкладки — это очень важно, когда у вас есть совместный проект. Люди, отправляющие код в исходный репозиторий с вкладками, требуют, чтобы разработчики постоянно спорили о проблемах с пробелами (что в Python является БОЛЬШОЙ проблемой).

Python и все языки имеют предпочтительные соглашения. Вы должны изучить их.

Java любит MixedCaseStuff.

C любит szHungarianNotation.

Python предпочитает stuff_with_underscores.

Вы можете писать код на Java с помощью_python_type_function_names.
Вы можете писать код на Python с помощью javaStyleMixedCaseFunctionNamesThatAreSupposedToBeReallyExplict.

до тех пор, пока ваша константа: p

person ascotan    schedule 22.07.2009