문자열을 변수명으로 변환

Published by onesixx on

https://www.delftstack.com/ko/howto/python/python-string-to-variable-name/

a_var = range(2)
 
def locals_test():
    b_var = 3
    c_var = "hi"
    d_var = locals()
    print(d_var)

locals 와 global의 현재 namespace (전역, 지역, builtin)을 딕셔너리(dict)형식으로 반환.

locals()가 실행되어지는 함수내의 지역 namespace 들을 정리

globals는 전역, 지역, builtin 정보 모두 dict 형태

locals_test()
#{'b_var': 3, 
# 'c_var': 'hi'}

e_var = globals()
print(e_var)
#{'__name__': '__main__',
# '__doc__': 'Automatically created module for IPython interactive environment',
# '__package__': None,
# ...
# 'a_var': range(0, 2),
# ...
#}

globals() locals()

globals()

현재 전역 기호 테이블의 사전을 반환합니다.

전역 심볼테이블은 globals()함수를 사용하여 액세스 할 수있는 프로그램의 전역 범위와 관련된 모든 정보를 저장합니다.

user_input = input("Enter string for variable name: \
")
globals()[user_input] = 50
print(apple)
print(type(apple))

여기서 가장 먼저하는 일은input()함수를 사용하여 사용자로부터 입력을 받고 그 안에Enter a string for a variable name:문자열을 전달하는 것입니다. 그런 다음 사용자가 입력 할 값이 무엇이든 해당 값은user_input변수에 저장됩니다.

여기서는 사용자가user_input에 저장 될 문자열 값으로apple을 입력 할 것으로 예상합니다. 사용자가apple이외의 값을 입력하면NameError: name 'variable' is not defined오류가 발생합니다. apple의 값도 인쇄 한 다음 나중에 코드에서 유형을 확인하기 때문입니다.

사용자가 올바른 값을 입력 한 경우globals()를 사용하여 전역 사전을 수정하여 전역 사전을 수정하고apple변수에 값을 할당 할 수 있습니다. 여기서는apple변수에50을 할당했습니다

 ~/test01.py
Enter string for variable name: apple
    
50


 ~/test01.py
Enter string for variable name: orange
    
Traceback (most recent call last):
    File "/Users/onesixx/test01.py", line 3, in 
NameError: name 'apple' is not defined

locals()

현재 지역 기호 테이블의 사전을 반환합니다. 

locals()함수를 사용하여 로컬 기호 테이블에 액세스 할 수 있습니다. locals()함수는globals()함수와 거의 동일한 방식으로 작동합니다.

유일한 차이점은locals()는 로컬 심볼 테이블에 액세스 할 수 있고, globals()는 글로벌 심볼 테이블에 액세스하여 사전을 반환 할 수 있다는 것입니다.

user_input = input("Enter string for variable name: \
")
locals()[user_input] = 50
print(apple)
print(type(apple))

이 코드는globals()와 동일한 방식으로 작동합니다. 유일한 차이점은 여기서locals()함수를 사용했다는 것입니다

exec()를 사용

 exec()함수는 Python 프로그램을 동적으로 실행하는 데 사용됩니다.
문자열 값 Elon을 저장하는name변수가 있습니다.

name = 'Elon'
#exec("%s = %d" % (name,100))
exec(f"{name}=100")
print(Elon)

exec()함수 내에는 각각 문자열 값과 10 진수 값에 대한 자리 표시 자로 사용되는%s%d가 있습니다. 이는 할당 연산자=의 도움으로 문자열에 정수 값을 할당한다는 것을 의미합니다. %s%d는 모두 따옴표=로 묶여 있습니다. 그런 다음 내부에 두 가지가있는 괄호가 있습니다. 첫 번째는 생성 한 변수, 즉Elon값을 포함하는name이고 두 번째는 정수100입니다.

여기서name변수 대신 해당 변수 내의 값이 대체됩니다. 정수100Elon에 할당됩니다. Elon은 변수 이름이되며이를 인쇄하면100이 출력으로 표시됩니다.

eval()

https://bslife.tistory.com/65

col1, col2, col3 …. col999 의 변수값을 출력할려면,

print(col1)
print(col2)
print(col3)
...
print(col999)

eval() 함수을 활용 (매개변수로 받은 expression (=식)을 문자열로 받아서, 실행)

for i in range(1, 999):
\tprint(
        eval(f"col{i}")
    )

eval()함수는 그 자체로 취약점이 될 수 있기 때문에 주의해서 사용해야 함

Categories: Python Basic

onesixx

Blog Owner

Subscribe
Notify of
guest

0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x