파이썬 문자열(str)을 이용해 변수(variable)값 출력하기
많은 초심자분들이 파이썬을 처음 시작하고 리스트와 딕셔너리를 알기전에 a_0, a_1, a_2, ... 이렇게 변수를 만들고 반복문으로 변수에 접근하려 합니다.
eval 이용
eval은 문자열로 된 코드를 인터프리터를 통해 실행해주는 함수입니다. 정말 편한것 같은 함수이지만.. 만약 eval안에 실행되는 문자열이 외부에서 들여온 코드일 경우, 외부 사람이 함부로 저희가 만든 프로그램에 코드로 간섭을 할 수 있는 보안에 취약점이 존재합니다. 그렇기 때문에 최대한 지양해야된 함수임을 미리 알아두시면 좋을것 같습니다.
eval의 취약점
입력 : __import__ ( 'os').system('whoami')
# eval 함수의 취약점
command = input()
eval(command)
eval함수 사용
eval(str)함수는 문자열을 넣어줘서 해당 문자열 소스 코드를 실행 사용하기에 따라 유용한 함수입니다. 예를 들어 계산기를 만든다고 했을때 1+2*3을 계산해야 된다고 합시다. 2*3가 연산자 우선순위가 더 높아 먼저 계산해야 되어서 계산순서를 따져줘야 되는 번거로움이 있는데요. eval("1+2*3")을 통해 컴퓨터에게 계산을 맡길 수 있습니다.
하지만 위에서본 보안상 및 성능 등 이유로 지양해야 하며, 대부분의 문제는 eval없이도 해결 할 수 있다는 것을 알아두셔야 합니다.
# eval 함수 사용
print("eval 이용")
a_0 = 10
a_1 = 20
a_2 = 30
print("a_0 ~ a_2 출력")
for i in range(3):
eval(f"print(a_{i})")
ㄱ = "A"
ㄴ = "M"
ㄷ = "B"
ㄹ = "N"
s = 'ㄱㄴㄷㄹ'
print("ㄱㄴㄷㄹ 출력")
for i in s:
eval(f"print({i})")
dictionary 딕셔너리 이용
eval을 쓰지않는것은 이러한 대체로 코드를 짤수 있는 방법이 있기 때문입니다. 문자열로 변수를 불러오고 싶다면 딕셔너리 자료형을 쓰는게 좋습니다.
딕셔너리는 여러가지 기능을 포함하고 있기 때문에 훨씬더 편하게 코드를 짤 수 있습니다.
# 딕셔너리 이용하기
a = list('ㄱㄴㄷㄹ')
b = list('AMBN')
d = {key:value for key, value in zip(a, b)}
print("딕셔너리 이용")
for key in a: # a == d.keys()
print(d[key])
# 딕셔너리는 메소드를 지원해주는 등 이점이 있음
for key, value in d.items():
print(key, value)