문자열을 변수명으로 변환
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변수 대신 해당 변수 내의 값이 대체됩니다. 정수100이Elon에 할당됩니다. Elon은 변수 이름이되며이를 인쇄하면100이 출력으로 표시됩니다.
eval()
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()함수는 그 자체로 취약점이 될 수 있기 때문에 주의해서 사용해야 함