파이썬에서 언더스코어(_)의 기능은 조금 특별하다. 언패킹에서의 예제에서 홀로 쓰여있는 언더스코어를 보고 조금 더 검색해 봤는데, 함수나 변수에 언더스코어를 사용하여 private 처럼 설정이 가능하다는 것이 새롭다. 참고로 파이썬에서는 C++ 이나 JAVA 처럼 private/protected/public 등의 키워드를 사용하여 리소스 접근 제어를 완벽하게 지원하지 않지만 언더스코어를 사용하여 효과적으로 사용할 수 있다.
언더스코어(_)의 기능
1. 인터프리터에서 마지막 표현식의 값을 불러올 때
2. 자리는 채워야 하지만 그 값을 무시해도 상관없을 때
# unpacking x, _, y = (1, 2, 3) # index for _ in range(10): do_something() for _, val in list_of_tuple: do_something() | cs |
3. 변수나 함수 선언시 사용
파이썬에서 변수나 함수를 private 으로 지정하는 방법으로 언더스코어(_) 를 사용할 수 있다.
변수나 함수 선언시 이름 앞에 언더스코어(_)를 붙이면 private 로 지정되어, 모듈을 from import 할 때 private 변수나 함수들은 import 되지 않을 것이며, __all__ 에 지정되어 있으면 다른 모듈에서 직접 호출할 수 있다.
이름 앞에 싱글 언더스코어(_single_leading_underscore)
- 해당 변수나 함수를 가진 모듈을 from class_file import * 로 호출하면, import 때 무시되어 사용할 수 없다.
- 모듈 내부에서만 사용가능한 private 역할로 사용할 수 있지만, import 로 직접 호출하면 사용 가능하다.
이름 뒤에 싱글 언더스코어(single_trailing_underscore_) : protected
- 내장함수 및 예약어 등의 이름을 사용하고 싶을때 충돌을 방지하기 위해 사용한다.
이름 앞에 더블 언더스코어(__double_leading_underscore) : private
- 인터프리터에서 파싱할 때 그 이름을 그대로 사용하지 않고 내부 규칙에 의해 임의의 이름이 붙여짐(mangle).
- 파이썬에서의 맹글링은 _ClassName__method 가 된다.
- 기존 이름에 직접 접근할 수 없으므로, 주로 클래스 내부에서만 사용한다.
이름 앞뒤에 더블 언더스코어(__double_leading_and_trailing_underscore__)
- __init__ 같은 매직 메소드를 표현할 때 사용한다.
- 사용자 정의도 가능하지만 거의 사용하지 않는다.
4. 숫자 리터럴(Numeric Literals) 에서의 가독성
숫자를 구분하며 가독성을 높일 때(실제값에 영향을 주지 않음)
>>> 1_000_000_000_000_000 1000000000000000 >>> 0x_FF_FF_FF_FF 4294967295 | cs |
5. 국제화(i18n), 지역화(l10n) 함수에 사용
i18n/l10n 라이브러리인 gettext 와 웹프레임워크인 Django 의 공식 문서에서도 언더스코어(_)를 사용하고 있다.
import gettext gettext.bindtextdomain('myapplication', '/path/to/my/language/directory') gettext.textdomain('myapplication') _ = gettext.gettext # ... print(_('This is a translatable string.')) | cs |
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) | cs |