Python

PEP 8 - Naming Convention

heon28 2024. 11. 23. 19:40

Naming Convention


작명스타일 종류

  • (A) only 대문자 + 밑줄(_)만 허용
    • 예시) UPPERCASE, UPPER_CASE_WITH_UNDERSCORES
  • (B) only 소문자 + 밑줄(_)만 허용
    • 예시) lowercase, lower_case_with_underscores
  • (C) CapWords(=CapitalizeWords, CamelCase, StudlyCaps)
    • 예시) CapitalizeWords
    • 약어를 사용할 경우,약어의 모든 문자는 대문자를 추천 -> HTTPServerError
  • (D) mixedCase
    • CapWords에서 가장 앞글자를 소문자로 한 것
    • 예시) mixedCase

형식별 작명 규칙 (A,B,C,D는 위의 작명스타일 종류에 해당)

  • (1) 패키지명
    • 모두 소문자를 사용하여 짧게 짓고, 밑줄은 권장되지 않음 -> (B) + 밑줄 권장되지 않음
  • (2) 모듈명
    • 모두 소문자를 사용하여 짧게 짓고, 밑줄은 가독성 향상시에 사용 가능 -> (B) + 밑줄 일부 허용
  • (3) 클래스명
    • 일반적으로 CapWords -> (C)
    • 인터페이스가 문서화되어 있고, 주로 Callable로 사용되면 함수의 작명 컨벤션을 따를 수 있음
  • (4) 함수명
    • 모두 소문자를 사용하고, 가독성 향상을 위해 밑줄로 단어를 구분할 것 -> (B) + 밑줄 허용
  • (5) 변수명
    • 모두 소문자를 사용하고, 가독성 향상을 위해 밑줄로 단어를 구분할 것 -> (B) + 밑줄 허용
  • (6) 타입변수명
    • CapWords -> (C)
    • _co, _contra를 공변(covariant)과 반변(contravariant) 선언 시 접미사에 붙일 수 있음
  • (7) 전역변수명
    • 모두 소문자를 사용하고, 가독성 향상을 위해 밑줄로 단어를 구분할 것 -> (B) + 밑줄 허용
    • 모듈 내에서만 사용하고 싶다면 밑줄('_')을 앞에 붙일 것. 예시) _inner_use_var
  • (8) 메소드명/인스턴스변수
    • 모두 소문자를 사용하고, 가독성 향상을 위해 밑줄로 단어를 구분할 것 -> (B) + 밑줄 허용
    • non-public은 앞의 밑줄('_') 추가. 맹글링은 밑줄 2번('__') (아래에서 보다 자세히 설명)
  • (9) 상수
    • 주로 모듈 레벨에서 정의되고, 대문자+밑줄로만 작성 -> (A)

변수명의 밑줄(_) 선행 후행 사용

  • (1) 가장 앞의 밑줄 1개
    • weak "internal use"
    • 클래스나 함수, 모듈 등 해당 객체 내에서 내부 사용을 목적으로 하는 것들을 명시함
    • from M import * 를 통해서 해당 객체는 import 되지 않음
  • (2) 가장 뒤의 밑줄 1개
    • 파이썬 키워드와의 충돌을 피하기 위한 목적으로 명시
    • 파이썬 키워드는 이미 예약되어 있는 문자열로 다른 용도로 사용이 불가능한 문자열. class, def, break, global, print 등등
    • 예시) 함수 인자에 사용: tkinter.Toplevel(master, class_='ClassName')
  • (3) 가장 앞의 밑줄 2개
    • Name Mangling(맹글링)에 사용
    • Mangling은 '짓이기다'는 뜻으로, 파이썬이 해당 변수/함수의 이름을 자체적으로 바꾸어, 원래 이름으로는 접근이 안 되게함!
    • 일단, private 변수처럼 강하게 내부에서만 사용하려는 목적으로 사용되는 듯하지만... 생각보다 쉽게 찾을 수 있음!
    • __변수/함수명으로 변수명을 지정해도 _클래스명__변수/함수명와 같이 변수명이 변경됨
    • 참고링크: https://tibetsandfox.tistory.com/21
  • (4) 가장 앞과 뒤의 밑줄 2번(__변수/함수명__)
    • 사용자 제어 네임스페이스에 있는 Magic객체 또는 속성들. (init, import, file 등등 명시된 것만 사용할 것)
    • 이미 파이썬 내 정의되어 있고, 클래스 내부에서 매직 메소드를 오버라이딩하여 사용할 수 있음
    • 직접 호출해서 사용하는 것이 아닌 정해진 규칙에 따라 알아서 호출된다는 특징
    • 참고 링크: https://tibetsandfox.tistory.com/42

밑줄 하나와 두개로 변수명 생성 시 예제

# python
class Temp():
    def __init__(self, instance_var):
        self.instance_var = instance_var
        self._weak_private_var = 500
        self.__strong_private_var = 1000

temp_instance = Temp(1)

# (1) weak internal use: 내부적으로 사용할 목적으로 변수를 생성했으나 호출은 가능
print(f"_weak_private_var: {temp_instance._weak_private_var}")

# (2) Name Mangling: private 변수처럼 강하게 내부적으로 사용할 목적으로 변수를 생성하여 호출 시 존재하지 않는 변수라고 출력됨
try:
  print(f"__strong_private_var: {temp_instance.__strong_private_var}")
except Exception as e:
  print(e)

# (3) Name Mangling: 하지만, 변수명이 변경된 것 뿐, 굳이 찾으려고 하면 찾을 수 있음 (_클래스명__변수/함수명)
print(f"_Temp__strong_private_var: {temp_instance._Temp__strong_private_var}")

 

(기타) 밑줄(_)의 다양한 사용방법 참고 링크