SW개발/Python

[Python]파이썬의 언더스코어(_)에 대하여

파이썬에서는 종종 언더스코어(_)가 사용되는 경우가 있다. 다른 언어와는 달리 파이썬에서는 이 문자는 여러 의미를 가지고 있다.

크게 5가지의 경우에서 언더스코어가 사용된다.

  1. 인터프리터에서 마지막 값을 저장할 때
  2. 값을 무시하고 싶을 때
  3. 변수나 함수명에 특별한 의미/기능을 부여하고 싶을 때
  4. 국제화/지역화 함수로써 사용할 때
  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__

PEP8 네이밍 컨벤션

 

PEP 8 -- Style Guide for Python Code

The official home of the Python Programming Language

www.python.org

 

_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한 코드를 작성할 수 있을 것이다.

 

728x90

'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