본문 바로가기

Python

Python: 동적으로 변수 이용 # 전역변수, 지역변수, globals(), locals(), importlip, getattr

728x90
반응형

* globals, locals

f'{model_name}Form'

위와 같은 형태의 이름 가진 class Form을 동적으로 가져와서 이용하려고 할 때,

import를 통해 전역변수에 위 이름을 가진 변수가 있으면 다음과 같이 globals() 사용 가능
globals()[f'{model_name}Form']

 

globals()  전역변수 접근
locals()     지역변수 접근
 
globals는 전역변수에 대한 접근 자체가 보안 위험이 있을 수 있으므로
importlib으로 호출을 해서 getattr 을 이용하는게 좀 더 안전한 방법

 

* importlib

import importlib

def book_list(request, model_name):
    form_module = importlib.import_module('books.forms')
    form_name = f'{model_name}Form'
    imported_form = getattr(form_module, form_name)
    ...
 

- 어떤 점에서 더 뭐 안전한 방법이라는 것일까?

전역변수에 접근한다는 것은, 내가 전역변수에 대해 모두 정확히 파악하고 있는것이 아니라면
이미 선언된 전역변수가 있는 경우에 임의로 바꿔서 사용하는 일 등이 생길 수 있다.
또는 원하지 않는 변수가 호출되서 사용되거나.
그러므로 가급적 전역변수를 이용하는 방법은 자제하는 것이 안정적이다.

 

* getattr

위에서 getattr(form_module, form_name)이 쓰였는데,
위에서 getattr은 form_module.form_name 과 같은 역할을 해준다.
그런데 .을 쓰지 않고 getattr을 쓴 이유는 무엇일가?
form_name이 str이기 때문이다. .str으로 속성값을 가져올 수 없는데,
위와 같이 동적으로 form_name을 생성해주어야 해서 str값으로 밖에 받을 수 없을 때, 주어진 변수의 속성값에 접근할
있기 때문이다.

 

728x90
반응형