문자열을 변수명으로 변환
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()함수는 그 자체로 취약점이 될 수 있기 때문에 주의해서 사용해야 함