1. return 값을 무시하기 위해서
H,W,_ = img.shape
이것은 .shape의 3번째의 return 값을 무시하기 위한 언더스코어이다. python은 라이브러리가 많아서, 함수를 임포트하여 사용하는 일이 많다. 그럴 때, 혹시 함수로부터의 return값이 복수여서 사용하지 않는 부분이 있다면 언더스코어를 사용하여 del 이나 return시에 폐기하도록 할 수 있다.
2. 함수명에 사용했을 경우
이 경우 4가지 종류가 있는듯 하다. 게다가 PEP8코딩 규약에 정의가 되어 있는듯 하다.
※ PEP8 ; Naming Convention에 자세하게 적혀 있는 웹 사이트.
1) _function(x) : 함수 앞에 1개
def _single_leading_underscore(x):
return n
#weak "internal use" indicator. E.g. from M import *
#does not import objects whose names start with an underscore.
이렇게 작성하면, 다른 곳에 from func import*로 부를 수 없지만, classx._func()이라는 class 내의 함수로써는 언더 스코어를 붙인 함수를 부를 수 있는 듯하다. 기본적으로 외부참고를 허용하지 않다는 것이 언더 스코어를 1개 붙인 함수이다.
즉 주로 한 모듈 내부에서만 사용하는 private 클래스/함수/변수/메서드를 선언할 때 사용하는 컨벤션이다. 이 컨벤션으로 선언하게 되면 from module import *시 _로 시작하는 것들은 모두 임포트에서 무시된다. 그러나, 파이썬은 진정한 의미의 private을 지원하고 있지는 않기 때문에 private을 완전히 강제할 수는 없다. 즉, 위와 같은 임포트문에서는 무시되지만 직접 가져다 쓰거나 호출을 할 경우엔 사용이 가능하다. 그래서 “weak internal use indicator"라고 부르기도 한다.
2) function(x)_ : 함수 뒤에 1개
def list_(x):
return n
#used by convention to avoid conflicts with Python keyword
list나 class등 python의 예약어를 함수명으로 사용하고 싶을 때 뒤에 언더스코어 1개를 붙인다.
3) __function(x) : 클래스명 앞에 2개
def __double_leading_underscore:
return n
#when naming a class attribute, invokes name mangling
#(inside class FooBar, __boo becomes _FooBar__boo; see below).
클래스 내의 함수의 앞에 언더스코어 2개를 붙인 것을 Mangling(マングリング)이라고 부른다. Mangling이란 '이름 수식'의 의미로, 컴파일러나 인터프리터가 변수/함수명을 그대로 사용하지 않고 일정한 규칙에 의해 변형시키는 것을 말한다.
파이썬의 맹글링 규칙은 더블 언더스코어로 지정된 속성명 앞에 _ClassName을 결합하는 방식이다. 즉, ClassName이라는 클래스에서 __method라는 메서드를 선언했다면 이는 _ClassName__method로 맹글링 된다.
더블 언더스코어로 지정된 속성명은 위와 같이 맹글링이 되기 때문에 일반적인 속성 접근인 ClassName.__method으로 접근이 불가능하다. 따라서 위에 적혀 있는대로, class FooBar내의 변수 __boo는 FooBar._boo로는 부를 수 없고, _FooBar__boo로 작성하지 않으면 안된다는 것이다. 이는 서브 클래스의 이름 충돌을 피하기 위해 사용한다. 서브 클래스와 같은 이름을 사용하여도, 별개로 취급할 수 있다. 클래스명을 추가하는 것으로 외부에서도 접근할 수 있다. 물론, 전용 변수에 접근하는 것은 룰 위반이지만, 디버깅시에 편리하다.
4) __function__(x) : 함수 앞 뒤에 2개씩
def __double_leading_and_trailing_underscore__:
return n
# "magic" objects or attributes that live in user-controlled
# namespaces. E.g. __init__, __import__ or __file__. Never invent
# such names; only use them as documented.``
class내의 함수의 앞 뒤로 2개씩 언더스코어를 붙이면 Magic Method(특수 메소드)가 된다. __init__, __len__과 같은 메서드들이 있다. 특수 메소드란 객체의 행동을 변경하거나, 클래스의 특성에 맞도록 작동시키고 싶을 때 사용한다.
예를 들어 __init__은 전달된 인수를 사용하여, 클래스 정의에서 새로 만들어진 객체를 초기화하는 것이다. magic method는 엄청 많으므로 더 많은 내용은 링크를 참고하는 것이 좋을 것 같다.
3. 숫자를 읽기 쉽게 하기 위해
>>> 1_000_000
Out: 1000000
python3.6버전 이후에는 숫자를 읽기 쉽도록 하기 위해 언더스코어를 숫자 내에 추가하는 것이 가능하다. 일반적으로 3자리 단위씩 끊어 읽기 위해 사용된다.
4. 인터 프리터에 마지막에 표시되는 값을 나타내기 위해
>>> 10
Out: 10
>>> _ * 3
Out: 30
>>> _ * 10
Out: 300
python 인터프리터를 사용하고 있을 때, 언더스코어를 이용해 변수에 넣은 값을 표시할 수 있다.
5. 국제화(i18n) / 지역화(l10n)함수로 사용하기 위해
이는 어떤 특정한 문법적 규칙이라기보단 말 그대로 컨벤션이다. 즉, _가 국제화/지역화 함수라는 의미는 아니며, i18n/l10n 함수를 _로 바인딩하는 C 컨벤션에서 유래된 컨벤션이다. i18n/l10n 라이브러리인 gettext라는 파이썬 내장 라이브러리 API 문서에서도 이 컨벤션을 사용하고 있으며, i18n과 l10n을 지원하는 파이썬 웹 프레임워크인 Django의 공식 문서에서도 이 컨벤션을 소개하면서 사용하고 있다.
# gettext 공식 문서 참고 : https://docs.python.org/3/library/gettext.html
import gettext
gettext.bindtextdomain('myapplication', '/path/to/my/language/directory')
gettext.textdomain('myapplication')
_ = gettext.gettext
# ...
print(_('This is a translatable string.'))
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)
참고자료
https://qiita.com/kiii142/items/6879cb065ad4c5f0b901
https://mingrammer.com/underscore-in-python/
'IT > 언어' 카테고리의 다른 글
[python] 머신러닝을 위한 Python(2) (0) | 2020.06.03 |
---|---|
[python] 머신러닝을 위한 Python(1) (0) | 2020.06.03 |
[python/Numpy] Numpy배열 ndarray의 슬라이스를 이용한 부분 배열의 선택과 대입 (0) | 2020.05.27 |
[python] Python의 os 모듈 사용법 정리 (0) | 2020.05.21 |
[python] ArgumentParser(argpaser)의 사용법 간단 정리 (0) | 2020.05.20 |