파이썬에서는 종종 언더스코어(_)가 사용되는 경우가 있다. 다른 언어와는 달리 파이썬에서는 이 문자는 여러 의미를 가지고 있다.
크게 5가지의 경우에서 언더스코어가 사용된다.
- 인터프리터에서 마지막 값을 저장할 때
- 값을 무시하고 싶을 때
- 변수나 함수명에 특별한 의미/기능을 부여하고 싶을 때
- 국제화/지역화 함수로써 사용할 때
- 숫자 리터럴값의 자릿수 구분을 위한 구분자로써 사용할 때
인터프리터에서 사용되는 경우
Python 3.6.1
>>> 10
10
>>> _
10
>>> _ * 5
50
>>> _ - 10
40
파이썬 인터프리터에서는 마지막으로 실행된 결과값이 _라는 변수에 저장된다. 이를 활용해 위처럼 사용할 수도 있다.
값을 무시하고 싶은 경우
# 언패킹시 특정값을 무시
x, _, y = (1, 2, 3) # x = 1, y = 3 (2라는 값이 무시됨)
# 여러개의 값 무시
x, *_, y = (1, 2, 3, 4) # x = 1, y = 4 (2, 3 무시)
# 인덱스 무시
for _ in range(30):
do_anything()
# 특정 위치의 값 무시
for _, val in list_of_tuple:
do_anything()
특별한 의미의 네이밍을 하는 경우
파이썬에서 _가 가장 많이 사용되는 곳은 네이밍일 것이다. 파이썬 컨벤션 가이드라인인 PEP8에는 다음과 같은 4가지의 언더스코어를 사용한 네이밍 컨벤션이 있다.
- _single_leading_underscore
- single_trailing_underscore_
- __double_leading_underscores
- __double_leading__and_trailing_underscores__
_single_leading_underscore
주로 한 모듈 내부에서만 사용하는 private 클래스/함수/변수/메서드를 선언할 때 사용하는 컨벤션이다.
from moudule import * 을 사용시 _로 시작하는 것은 모두 import에서 무시된다.
# private 변수
_leffe = 'leffe'
# private 메서드
def _anything(self):
return blahblah
single_trailing_underscore_
파이썬 키워드와의 충돌을 피하기 위해 사용하는 컨벤션이다.
# list와의 충돌을 피함
list_ = List.objects.get(1)
__double_leading_underscores
클래스 속성명을 맹글링하여 클래스간 속성명의 충돌을 방지하기 위한 용도로 사용된다.
(맹글링이란 컴파일러나 인터프리터가 변수/함수명을 그대로 사용하지 않고 일정한 규칙에 의해 변형시키는 것)
class Leffe:
def _single_method(self):
pass
def __double_method(self): # 맹글링을 위한 메서드
pass
class Tistory(Leffe):
def __double_method(self): # 맹글링을 위한 메서드
pass
print(dir(Leffe())) # [']
print(dir(Tistory()))
Python 3.6.1
>>> class A:
... def _single_method(self):
... pass
... def __double_method(self):
... pass
>>>
>>> class B(A):
... def __double_method(self):
... pass
...
>>>
>>> print(dir(A()))
['_A__double_method', ... , '_single_method']
>>> print(dir(B()))
['_A__double_method', '_B__double_method', ... , '_single_method']
# 서로 같은 이름의 메서드를 가지지만 오버라이드가 되지 않음
__double_leading__and_trailing_underscores__
스페셜 변수나 메서드(매직 메서드라고도 부름)에 사용되는 컨벤션이다. 매직메서드에는 __init__, __len__, __dict__ 같은 것들이 존재한다.
class Leffe:
def __init__(self, leffe): # 초기화 작업을 진행함
self.leffe = leffe
국제화/지역화 함수로 사용되는 경우
국제화를 위한 i18n/l10n을 지원하는 gettext 파이썬 내장 라이브러리 API 문서에서 _ 컨벤션을 사용하고 있다.
i18n과 l10n을 지원하는 파이썬 웹 프레임워크인 Django의 공식 문서에서도 이 컨벤션을 소개하면서 사용하고 있다.
from django.utils.translation import ugettext as _
from django.http import HttpResponse
def translate_view(request):
translated = _('This string will be translated.')
return HttpResponse(translated)
숫자 리터럴값의 자릿수 구분을 위한 구분자로 사용되는 경우
Python3.6에 추가된 문법으로 언더스코어로 숫자갑을 좀 더 읽기 쉽도록 자릿수를 구분할 수 있게 되었다.
dec_base = 1_000_000
bin_base = 0b_1111_0000
hex_base = 0x_1234_abcd
print(dec_base) # 1000000
print(bin_base) # 240
print(hex_base) # 305441741
대부분은 파이썬을 개발하면서 언더스코어(_)를 정확히 언제 어떻게 사용하는지를 모르고 있는 경우가 많다.
나 역시도 대수롭게 넘어가고는 했는데, 한번 파이썬의 관례들에 대해 깊이 알아보고자 공부해보게 되었다.
생각했던 것 보다 많은 경우에서 사용한다는 것을 알게 되었고, 다양한 관례들을 익혀나간다면 조금 더 Pythonic한 코드를 작성할 수 있을 것이다.
'SW개발 > Python' 카테고리의 다른 글
[Python]property로 getter, setter 구현하기 (1) | 2021.07.28 |
---|---|
[Python]all(), any() 함수란? (0) | 2021.07.26 |
[Python]패키지란? (0) | 2021.01.21 |
[Python]if __name__ == "__main__" 란? (0) | 2021.01.20 |
[Python]모듈이란? (0) | 2021.01.20 |