파이썬에서 언더스코어(_)는 다양한 의미를 가진다.
목차
Case1. 언더스코어가 독립적으로 사용
인터프리터에서 마지막 실행 결과 값을 가지는 변수로 ('_') 사용
>> 1+3
4
>> x = _
>> print(x)
4
>> y = _ + 10
>> print(y)
14
Case2. 변수로 사용 될 경우
- 변수 값을 굳이 사용할 필요가 없을 때 사용
- 변수를 문자로 할당해주어도 되지만 굳이 사용하지 않을 경우에 _로 치환함. 변수명이 낭비될 필요가 없기 때문
for _ in range(5): # 단순히 5번 반복할 목적으로
print('hello Juhyeong')
for _ in range(3): # _를 i로 꿔서 보면 우리에게 익순한 표현식이 될것이다.
print(_)
def values():
return (1,2,3,4) # 튜플을 반환
a, b, _, _ = values() # 반환된 튜플 값중 2개만 필요할 경우
print(a, b)
=========출력=========
hello Juhyeong
hello Juhyeong
hello Juhyeong
hello Juhyeong
hello Juhyeong
0
1
2
1 2
Case3. __이름__ (더블 언더스코어)
내장된 특수한 함수와 변수를 나타낸다.
class vector:
def __init__(self, x,y,z):
self.x = x
self.y = y
self.z = z
def __add__(self, other):
x_ = self.x + other.x
y_ = self.y + other.y
z_ = self.z + other.z
return vector(x_,y_,z_)
def show(self):
print(f"x:{self.x}, y:{self.y}, z:{self.z}")
v1 = vector(1,2,3)
v2 = vector(4,5,6)
v3 = v1 + v2
v3.show()
=========출력=========
x:5, y:7, z:9
스페셜 변수나 메서드(매직 메서드라고도 부른다.)에 사용되는 컨벤션이며, __init__, __len__과 같은 메서드들이 있다.
Case4. 네이밍
- 가장 많이 사용하는 경우이다.
- 변수 이름 뒤에 _ 가 붙는 경우, 함수 이름 왼쪽 _ 를 붙이는 경우, 변수 왼쪽에 _ 를 붙이는 경우, 그리고 mangling할 때 사용한다.
1) 변수명_ (single_trailing_underscore_)
- 예약어를 변수명으로 사용할 수 없을 때 사용한다. 즉, 파이썬 키워드와의 충돌을 피하기 위해 사용하는 컨벤션(PEP8-파이썬 코드 스타일 가이드)으로 그리 많이 사용하지는 않는다.
class Order:
def __int__(self):
self.coffee = 'Americano'
self.price = 4100
def printClassName(class_):
print(class_)
order = Order()
printClassName(order.__class__)
tkinter.Toplevel(master, class_='ClassName') # class와의 충돌을 피함
list_ = List.objects.get(1) # list와의 충돌을 피함
2) 함수 (_single_leading_underscore)
- 주로 한 모듈 내부에서만 사용하는 private 클래스/함수/변수/메서드를 선언할 때 사용하는 컨벤션이다.
- 이 컨벤션으로 선언하게 되면 from module import_시 _ 로 시작하는 것들은 모두 import에서 무시된다. 그러나 파이썬은 진정한 의미의 private을 지원하고 있지는 않기 때문에 private을 완전히 강제할 수는 없다. 즉, 위와 같은 import문에서는 무시되지만 직접 가져다 쓰거나 호출을 할 경우엔 사용이 가능하다. 그래서 weak internal use indicator 라고 부르기도 한다.
# Module1.py
def publicFunc():
print('this is public function')
def _privateFunc():
print('this is private function')
- 함수 이름 왼쪽에 _ 를 붙이면 다른 파일을 import할 때 _ 를 붙인 함수는 가져오지 않는다.
- 보안성이 약한 private 의미로 사용하는 경우이다. 파이썬은 진정한 private를 지원하지 않기 때문에 import문에서는 누락이 가능하지만 직접 가져다 쓰거나 호출을 할 때는 사용이 가능하다.
3) 변수명 왼쪽에(더블스코어)를 붙인 경우 (double_leading_underscores) -> Mangling
- 언더스코어 두개(_)를 붙인 변수는 선언된 클래스 안에서만 해당 이름으로 사용 가능하다. 다음 예제에서는 order.py안에서만 __price 변수가 __price이름으로 사용이 가능하고, 외부 모듈인 test.py 안에서는 __price이름으로 사용이 불가능하다.
# Module1.py
class Order:
def __init__(self):
self.coffee = 'Americano'
self.__price = 4100
def printInfo(self):
print(f"coffee : {self.coffee}")
print(f"price: {self.__price}")
# A.py
import Module1
order1 = Module1.Order()
print(order1.coffee) # 가능
print(order1.__price) # 오류
import Module1
order1 = Module1.Order()
print(order1._Order__price) #가능: 외부에서 Module1.py의 __price변수에 접근하러면 _클래스명__변수명 형식으로 사용할 수 있다. 이러한 작업을 '맹글링(Mangline)이라고 한다.
order1.printInfo() # 가능
'ETC' 카테고리의 다른 글
[python] 가변 매개변수(Arrbitary Argument) 란? (0) | 2021.11.09 |
---|---|
mac M1에서 안드로이드 애뮬레이터 사용하기 (0) | 2021.11.06 |
[ios]애뮬레이터 키보드 자판 보이기 (0) | 2021.11.06 |
[python] iterable 과 iterator 의 의미와 차이 (0) | 2021.11.03 |
[python] turtle, 세마리의 거북이 충돌없이 이동하기 (0) | 2021.10.24 |
영화추천 알고리즘(Movie-Recommender) 파이썬으로 구현해보기 (0) | 2021.10.24 |
댓글