Kimuksung
Kimuksung 안녕하세요. 분산처리에 관심이 많은 생각하는 주니어 Data Enginner입니다.

Python Namespace

 Python Namespace
Namespace란?

  • 특정한 Object를 이름에 따라 구분할 수 있는 범위
  • Python은 모든 것들을 Object로 관리한다고 말씀드렸는데,
  • 특정 이름과 Object를 Mapping 관계를 Dictionary 형태로 가지고 있다.
  • 각 Namespace는 딕셔너리 형태로 구현되며, Namespace의 Value는 Object를 가르킨다.
  • Built-in은 Namespace에 함부로 추가,삭제 불가
  • 결론 : 네임스페이스가 다르다면, 값을 참조할 수 없다.

우선 순위 built-in > global > local

  1. Global Namespace

    모듈 별로 존재

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
     test = "kai_test"
        
     print(globals())
     >
     {
     '__name__': '__main__',
     '__doc__': None, 
     '__package__': None, 
     '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x100940eb0>, 
     '__spec__': None, 
     '__annotations__': {}, 
     '__builtins__': <module 'builtins' (built-in)>, 
     '__file__': '/Users/wclub/git/airflow/wclub-airflow/dags/test6.py', 
     '__cached__': None, 
     'test': 'kai_test'
     }
    
  2. Local Namespace

    Function, Method 별로 존재, Funcion 내의 Local variable이 소속

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
     test = "kai_test"
        
     def namespace_test():
         test = "function test"
         print(locals())
        
     namespace_test()
     >
     {'test': 'function test'}
    
  3. Built-in Namespace

    기본 내장 함수 및 예외들의 이름 저장

    1
    
     print(dir(__builtins__))
    

https://ifh.cc/g/CTRxAd.jpg https://ifh.cc/g/BxYCOG.png

Global()

  • Global 변수에 접근 가능하게 만들어준다.
1
2
3
4
5
6
7
8
9
def namespace_test():
    global test
    test = "local_space"
    return

test = "kai_test"
print(test)
namespace_test()
print(test)
Local()

  • 상위 Level의 Local 변수를 접근 가능하게 만들어준다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
def namespace_test():
    test = 0
    def nonlocal_test():
        test = 100
        print(test)

    nonlocal_test()
    print(test)

def namespace_test2():
    test = 0
    def nonlocal_test():
        nonlocal test
        test = 100
        print(test)

    nonlocal_test()
    print(test)

namespace_test()
print("-"*10)
namespace_test2()

참조

https://leffept.tistory.com/431#:~:text=네임스페이스란 특정한 객체,을 네임스페이스라고 합니다.