[Python] 특별한 언더스코어(_)


파이썬에게 언더스코어(_)란?

한마디버전

한국어: 파이썬에게 언더스코어는 조금 특별합니다. 인터프리터가 사용하고, 값을 무시하고 싶을때나, 변수 앞뒤에 붙여 다른 의미로 사용하기도 합니다. PEP 15에서는 숫자 리터럴의 자릿수 구분자 역할이 추가되었습니다.


영어 : To Python, Underscore means a bit special as Interpreter uses it. Also, we use it when we want to ignore values, putting underscores in front of or after variables to specify some meaning. According to PEP 15,  underscores can be used as visual separators for digit grouping purposes in integral, floating-point and complex number literals.



역할 #1. 인터프리터가 사용하는 언더스코어

언더스코어는 파이썬 프롬프트나 인터프리터가 마지막으로 실행했던 구문의 값을 리턴합니다.

>>> a = 19
>>> b = 254
>>> _
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name '_' is not defined

>>> a+b
273
>>> _
273
>>> _ * 2
546



역할 #2. 값을 무시할때

반환된 값이 별 필요가 없을때, 사용 할 수 있습니다.

for _ in range(5):
print("hello")

dic = [['Hey', 'Underscore'], ['Come', 'Play With Me']]
for _, second in dic:
print(second)

for first, _ in dic:
print(first) >>> hello >>> hello >>> hello >>> hello >>> hello >>> Underscore >>> Play With Me >>> Hey >>> Come





역할 #3. 특별한 의미를 부여하고 싶을때

파이썬은 C++, C#, JAVA 처럼 접근지정자를 설정할 수 없습니다. 하지만, 변수 앞에 언더스코어를 붙임으로써, 내부에서 사용된다는 것을 인터프리터에게 알려줄 수 있고, import * 와 같이 모든 것을 임포트 하는 것으로는 해당 변수를 가지고 올 수 없습니다. 하지만 직접적으로 호출하거나 하면 호출이 됩니다. 이는 파이썬의 약점 중 하나 입니다.


또한 파이썬에는 식별자로 사용제한이 있습니다. 파이썬 내에서 특별한 기능을 하는 키워드 들인데요. 이 키워드와 같은 이름을 가진 객체는 존재할 수 없습니다. 파이썬 3.6 기준으로 33개 입니다.


  • True
  • False
  • def
  • if
  • raise
  • None
  • del
  • import
  • return
  • elif
  • in
  • try
  • and
  • else
  • is
  • while
  • as
  • except
  • lambda
  • with
  • assert
  • finally
  • nonlocal
  • yield
  • break
  • for
  • not
  • class
  • from
  • or
  • continue
  • global
  • pass 

위와 같은 단어들을 헷갈리지 않고 변수나 함수명으로 쓰고 싶을때 사용합니다.

아래는 예제 입니다.

data = [1, 2, 3, 4]
del_ = data[1]
data.remove(del_)
print(data) >>> [1, 3, 4]


**더블 언더스코어**

앞에 나오는 더블 언더스코어는 파이썬 인터프리터에게 하위 클래스의 충돌을 피하기 위해 이름을 다시쓰도록 알리고, 인터프리터는 글래스 확장 및 맹글링(Mangling) 이라는 기능을 사용해서 변수 이름을 변경합니다.

class Myclass():
def __init__(self):
self.__variable = 10        self.abc= 20
def func(self):
print('>>>',self.__variable)


obj = Myclass()
obj.func() print(obj.abc) obj.__variable >>> 10 >>> 20 Traceback (most recent call last): File "C:/Users/Ryan/PycharmProjects/RyanArbi/hbc_utils_usdt.py", line 11, in <module> obj.__variable AttributeError: 'Myclass' object has no attribute '__variable'

키 포인트는 내부에서만 접근 가능해 집니다. 외부에서는 접근할 수가 없습니다. 이게 이 더블언더스코어를 사용하는 주된 목적이에요. 위를 보면 abc는 접근할 수 있지만 __variable을 호출하면 Attribute Error를 만나볼 수 있습니다.


** __BEFORE_AND_AFTER__ **

파이썬에만 있는지.. 잘모르겠습니다. 주특기가 자바인 직장동료는 __main__ 을 보고 생소해 하더라구요.

더블 언더스코어로 시작하고 끝나는 파이썬에서 아주 특별한 메소드(공식문서에도 Special Methods) 입니다. 여러가지 Built-in 함수들이 처리하는 연산을 정의하면서 어렵고 빡센일을 한방에 얍! 해낸다고 매직 메소드(Magic Methods) 라고 하고 언더스코어가 2개라서 줄여서 더스코어, 더언메소드!! 가 아니라 Double Underscore, Dunder(던더 메소드) 라고도 합니다. 

__init__, __add__, __len__, __repr__  등이 존재 하며 총 66개가 존재합니다.

추후 기능을 이야기 하기로 하고 더블 언더 스코어에 대해서만 말하자면, 
파이썬에서 모든 데이터는 객체입니다. 또는 객체와 객체 사이에 관계 입니다. 파이썬 안에 있는 스페셜 메소드를 재정의할 수 있게 해서 인터프리터의 연산처리에 도움을 줍니다. 재정의 해서 사용하는게 포인트입니다.

# 스트링 클래스 선언
class String:

# 객체 초기화
def __init__(self, string):
self.string = string

# 객체를 나타내는 공식적인 문자열입니다.
# repr()로 호출 할 수 있습니다.
def __repr__(self):
return 'Object: {}'.format(self.string)

# Driver Code


if __name__ == '__main__':
# 객체 생성
string1 = String('Hello')
print(__name__)
print(string1) >>> __main__ >>> Object: Hello

__name__은 해당 파일에서 호출했을 경우 __main__ 이지만, 참조해서 호출한다면 파일명이 뜹니다.



역할 #4.  i18(국제화) / i10(지역화)

언더스코어 그 자체가 함수로 사용되었으며, 문법이 아닌 컨벤션입니다.  문자열 번역에 사용하는 i18과  i10에서 자주 사용됩니다. 국제화와 지역화가 필요한 어플리케이션이 뭐가 있을까요?

맞습니다. 웹어플리케이션입니다.

이는 장고에서 자주 쓰입니다. 나중에 관련 포스팅을 추가하겠습니다.

from django.http import HttpResponse
from django.utils.translation import gettext as _

def my_view(request):
output = _("Welcome to my site.")
return HttpResponse(output)

출처: Django Official Document




역할 #5. 숫자 리터럴의 자릿수 구분자로 사용

인터넷에 수많은 글이 많지만 2017년 이전에 작성된 글에는 이 내용이 없습니다. 

2017년 PEP515에서 추가된 가이드 라인입니다. 파이썬 3.6에 추가된 문법으로 좀 더 편하게 사람이 읽을 수 있도록 한 재미있는 기능입니다.

# 1000 단위로 표시할때
amount = 10_000_000.0

# 16진수를 단어별로 묶을때
addr = 0xCAFE_F00D

# 2진수를 끊어 읽고 싶을때
flags = 0b_0011_1111_0100_1110

# String 2진수를 변경
flags2 = int('0b_1111_0000', 2)

print(amount)
print(addr)
print(flags)
print(flags2)
print(flags - flags2) >>> 10000000.0 >>> 3405705229 >>> 16206 >>> 240 >>> 15966


  • [[a.original_name]] ([[a.file_size | fileSizer]])
좋아요[[ postLike | likePlus ]]
공유
라이언

“Lead Python Engineer”

댓글 [[totalCommentCount]]
[[ comment.author__nick_name ]] [[ comment.datetime_updated | formatDate]] (수정됨)

[블라인드 처리된 글 입니다.]

답장
[[ sub.author__nick_name ]] [[ sub.datetime_created | formatDate ]] (수정됨)

취소
댓글을 남겨주세요.
'파이썬' 관련 최신 포스트
[[ post.title ]]
[[ post.datetime_published_from | DateOnly ]]