🐍Python | Django

[Python] Under Score(_)?

이줭 2022. 4. 14. 21:52
728x90

다른 언어에 비해 파이썬에서 언더스코어의 의미는 특별하다. 

파이썬에서 언더스코어는 어떤 의미로 쓰일까?

 

먼저, 인터프리터에서 사용되는 경우 마지막으로 실행결과 값을 저장하는 변수로 사용될 수 있다.

>>> 15
15
>>> _
15
>>> _ + 5
20
>>> _ * 10
200

 

다음으로 어떤 값을 무시하고 싶은 경우 사용할 수 있다. (I don't care)

# 언패킹 시 특정값을 무시, 여러 값을 무시
a, _, b = (1, 2, 3) # a = 1, b = 3
a, *_, b = (1, 2, 3, 4, 5, 6, 7) # a = 1, b = 7

# 인덱스를 무시할 때
for _ in range(10):
	pass

 

또한, 특별한 의미의 네이밍을 하는 경우 

  • _single_leading_underscore
  • single_trailing_underscore_
  • __double_leading_underscores
  • __double_leading_and_trailing_underscore__

 

_single_leading_underscore는 클래스의 변수, 메서드 앞에 붙여 사용하면 import시에 언더스코어가 붙은 변수나 함수는 가져오지 않게 되고, 클래스 내부에서만 사용할 수 있게 된다. 하지만, 파이썬은 진정한 의미의 private을 지원하지는 않기 때문에 직접 접근하여 사용하고자 할 때는 사용할 수 있다.

 

single_trailing_underscore_는 파이썬에서 사용하는 키워드와 충돌을 피하기 위해 사용한다.

 

__double_leading_underscores(Mangling)는 클래스의 속성값을 외부에서 접근하기 힘들게 할 때(private) 또는 하위 클래스가 상위 클래스의 속성, 메서드를 오버라이드 하는 것을 막을때, 이름 충돌 문제를 방지하기 위해 사용 할 수 있다.

class Parent:
	def __init__(self):
    	self.__a = 10
        
class Child:
	def __init__(self):
    	super().__init__()
        self.__a = 15
        
ins = Child()
print(ins.__a)

# AttributeError : 'Child' objects has no attribute '__a'

이와 같이 맹글링을 적용시키면 본연의 이름으로는 접근할 수 없고, 접근 시 AttributeError가 발생하는 것을 볼 수 있다.

 

해당 변수에 접근하고자 한다면 'ins._Chile__a' 와 같은 방법으로 접근해야 한다. 이러한 특징으로 더블 언더스코어를 사용해 진짜 private처럼 보이게 하는 경우가 있지만, 이는 private을 위한 것이 아니며 private 용도의 사용을 권장하지 않는다.

 

__double_leading_and_trailing_underscore__는 스페셜 변수나 메서드에 사용되는 컨벤션이며, __init__, __len__, __name__과 같은 메서드와 변수들이 있다.

 

특별히 기술적인 내용은 아니지만 파이썬에서의 언더스코어는 조금 특별한 의미를 갖기 때문에 정리해봤다~

728x90

'🐍Python | Django' 카테고리의 다른 글

[Python] main 함수  (0) 2022.04.26
[Python] Class와 상속(Inheritance)  (0) 2022.04.19
[Python] Decorator  (0) 2022.04.18
[Python] String join()/split()  (0) 2022.02.07
[Python] strftime과 strptime  (0) 2021.08.25