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
반응형
'Python' 카테고리의 다른 글
Python: Selenium in Linux # WSL # chromedriver # 예제 코드 (0) | 2023.03.06 |
---|---|
이중 삼중 for문 break # forloop # break (0) | 2023.03.04 |
sort # 복수의 값으로 정렬할 때 (0) | 2023.01.28 |
Python: insert() # insert argument in list (0) | 2023.01.23 |
Python: json.loads() # string to dict # doble quotes # Boolean (2) | 2023.01.22 |