Python
PEP 8 - Naming Convention
heon28
2024. 11. 23. 19:40
- 출처 링크
- 참고
- 본 글은 PEP-8 중 주관적으로 많이 사용하는 객체들에 대한 작명 규칙과 밑줄 사용에 대해서만 정리함!
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}")
(기타) 밑줄(_)의 다양한 사용방법 참고 링크