본문 바로가기
ETC

[python] 파이썬에서 언더스코어('_') 가 가지는 다양한 의미

by 안주형 2021. 11. 3.

파이썬에서 언더스코어(_)는 다양한 의미를 가진다.

목차

 

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()  # 가능

댓글