FrontEnd
Javascript
Diary
ML
CS
Django
Algorithm
AWS
Co-Work
HTML
CSS
Python
React
ReactNative

python 표기법,underline,underscore,naming

Python에서 __init__ 이나 __str__과 같은 함수를 종종 보았는데 그냥 뭔가 중요하고 내부적으로 돌아가는 함수라 생각하기만 했을뿐 제대로 찾아본적이 없었기에 한번 정리를 하려 한다.

일단 _(단일 언더라인)은 네이밍에 사용되는 경우가 있어서 이를 먼저 보고가자

표기법 관련

  • 스네이크 표기법 (firstword_secondword ) Python 변수명, 함수명, 메소드명에 사용
  • 낙타(camel) 표기법 ( firstwordSecondword ) JAVA에서 많이 사용
  • 파스칼(pascal) 표기법 ( FirstwordSecondword ) class의 선언과 같은 경우에 사용
  • 헝가리안 표기법 ( chmyword ) 접두어에 변수가 지닌 속성을 표기한다 (b : 불리언 str : 문자 등…) 하지만 지금은 지양되는 방법이라 한다

언더라인(언더스코어) 사용법

첫번째

    for _ in range(10):
        print(_)

    #뭐 이렇게 사용되는것으로 보아 _도 i와 같은 기능을 수행할 수 있는데
 
 
    x, *_, y = (1,2,3,4)   # x = 1, y =4

    #이런식으로 특정 부분의 문자를 의미없이 임시로 대체하고 싶을때 사용한다

두번째

name_ : 파이썬 키워드와의 충돌을 막기위해 사용된다.

__name__ : 사용자가 짓는 이름과 충돌을 막기위해서 Python system이 편의를 위해 사용 대게 이런 메서드나 변수는 특별한 기능을 제공하거나 수행(예약되어있음)

_name : 사용자가 private 하게 variable을 만들때 사용 (단 import되는 경우만 private하게 막아주고 직접 호출하는 경우에는 막을수 없다 = 파이썬은 완벽한 private을 지원하지 않는다)

__name : namemangles 관련된 사항으로 이를 사용하기 위해서는 좀더 명확하게 사용해야한다

namemangles : 프로그램에서 함수를 선언하거나 전역변수등 선언시 컴파일러의 특징에 따라 일정한 규칙을 통해 함수, 변수명이 변경된다

왜 변경되는가?

Function Overloading을 방지하기 위한 방법으로 동일한 이름으로 다른 기능을 하는 함수를 선언하게 되면 각 함수별로 구별하여 사용할수 있게 이름을 부여해준다

사용 예시 :

class A:
    def __init__(self):
        self.__a = 'a'
        self._b = 'b'

a = A()
a._b    >>> 'b'
a.__a   >>> object has no attribute Error

a._A__a >>> 'a'

이런식으로 사용할수 있다.

python naming

코딩이라는 것을 처음 배울때 naming을 왜 해야하지? 나는 남들과 다른 특별한 사람이니까 나만의 naming을 할꺼야! 하던 때가 있었는데

얼마 못가 개발자 선배님들께서 naming을 지키시는데는 다 이유가 있다는 것을 알게 되었습니다. 아는 만큼 보이고 도움이 되는 naming 규칙에 대해 PEP 8을 참고하여 정리하겠습니다.

  1. 단일 변수로 헷갈리는 알파벳을 사용하지 말자 'l' (소문자L), 'I' (대문자i)는 특정 폰트에서 1과 구분이 되지 않으므로 사용하지 맙시다. 이와 같은 이유로 'O'(알파벳) 또한 0과 구분되지 않으므로 사용하지맙시다.
  2. 모듈은 소문자로 된 짧은 이름
  3. 클래스 이름은 PascalCase 를 따른다. 단어의첫글자를 대문자로 한다(두 단어가 연결될때도 각 단어의 첫 글자를 대문자로 한다)
  4. 예외 이름은 예외가 클래스이름이므로 PascalCase를 따르는데 대신 변수의 접미사로 Error가 붙어야한다 (예외는 에러이기때문)
  5. 전역변수, 함수이름, 변수이름은 소문자를 사용한다. 단어사이 구분은 가독성을 위해 underscore( _ )를 이용한다.
  6. 메소드 및 함수의 인수규칙은 인스턴스 메소드의 첫번째 인수로는 항상 self를 사용합니다. 클래스 메소드의 첫번째 인수로는 항상 cls를 사용합니다.

ex) 클래스 메서드의 예시

def class_method(cls):
    pass

위와 같이 작성해주면 Class.class_method()로 호출할 수 있다. 함수의 인수 규칙은 키워드가 충돌하는 경우 접미사로 underscore를 붙여주는 것으로 해결할 수 있다.

  1. 상수는 모듈수준에서 정의되며 단어를 구분하는 밑줄을 포함하여 모두 대문자로 작성한다.