globals(); python 에서 string 을 변수로 변환하는 방법

운명애·2020년 12월 25일
1

Python

목록 보기
2/7

메리 크리스마스 🎄

django shell 에서 스타벅스 과제하다가 string 을 변수로 바꾸고 싶어졌다. 일 대 다 관계에서 다 에 위치하는 instance 를 생성할 때는 참조하는 대상이 필요하다. 그래서 참조하는 테이블의 instance 를 만들어주고 변수에 저장할 필요가 있는데, 카테고리 9 개에 변수를 일일이 지정해주려고 하니까 귀찮고 오래걸리고 분명히 더 나은 방법이 있을 것 같았다. 그리고 장고 쉘이 불안정한지 계속 팅기는데, 팅길때 마다 변수를 지정해줘야해서 열불이 났다.💢

string 에서 변수로 바꿔주면 더 빨리 처리가 가능한 작업인데, 찾아보니 역시 있었고 간단했다. 찾아보느라 시간이 더 걸린셈이 됐지만, 담에 써먹어도 되니까!
그리고 사용자에게 input 을 받은 값을 변수로 이용하는데 써먹을 수도 있다.

우선 다음의 작업을 한번에 하고 싶었다.

[coldbrew, espresso, ..., bottled] = Category.objects.all()

뒷 부분 코드의 결과가 QuerySet 으로 반환된다. list 와 비슷한 장고 자료구조다.

물론 저것도 많이 느리진 않지만 string 으로 한번에 변수로 지정할 순 없는지 궁금해졌다.

nameCat = "coldbrew-espresso-...-bottled".split("-")

nameCat 은 string 을 담은 리스트가 되는데, 여기서 각 string 을 변수로 바꿔서 각 QuerySet 객체를 담고 싶었다.

방법은 globals() 를 이용하면 된다.

globals()

globals() 는 python 내장 함수로, 정의된 global varibale 들을 dictionary에 담아서 보여준다.

예를 들어서, python shell 을 켜서 첫 줄에 a = 1 이라고 치고 globals() 를 호출하면, python 에서 자체적으로 미리 선언된 변수들과 함께 'a' 를 key 로 가지고 1 을 value 로 가지는 dictionary 를 보여준다.

a = 1
globals()
#output

{
	
    '__name__': '__main__',
         ...,
    'a': 1,
}

즉, gloabls() 가 반환한 dictionay 에서는 변수 이름이 key, 변수가 담고 있는 것(변수에 저장 가능한 어떠한 것도)이 value 로 저장된다.

이 성질을 이용해서 각 string 을 key 로 넣고 QuerySet 객체들을 value 로 넣으면 된다.

nameCat = "coldbrew-espresso-...-bottled".split("-")
categorySet = Category.objects.all()

for i in range(len(nameCat)):
	globals()[nameCat[i]] = categorySet[i]
    
coldbrew
# output 은 <QuerySet "콜 드 브 루">, 설정해놓은 __str__ 값에 따라 달라지겠죠?!

큰 개선은 아니지만 string 을 variable 로 바꾸는 방법을 알게되서 만족한다. 🤗

profile
개발자 하고 싶어요..

2개의 댓글

comment-user-thumbnail
2020년 12월 25일

메리 크리스마스 😁😁
쉘은 이제 제대로 되시나요? ㅋㅋㅋㅋㅋ

1개의 답글