2. 해외선물/2-6. 기타자료 (파이썬 함수 등)

(파이썬) 문자열의 내용 및 속성을 추출하는 ast 모듈

봄이오네 2024. 1. 31. 08:06
반응형

 

목 차
1. 들어가며
2. 사전설명
   1) ast 모듈 설명
   2) '리스트' 태형은 문자형
3. 코드설명
   1) 1차 시도 (실패)
   2) 2차 시도 (실패)
   3) 3차 시도 (성공)
4. 마치며

 

 

1. 들어가며

지난글에서는 통해 MCTS 개념이 활용된 PC와 사용자간 대결을 하는 틱택톡 게임 코드를 알아보았다. 직접 작성한 코드가 아닌 상태에서 설명을 하려니, 막히는 부분도 많고 추가적으로 공부해야 하는 내용들도 많게 느꼈다.

 

이번글에서는 지난글에서 이해하지 못했던 ast 라이브러리에 대해 알아보고자 한다.

 


2. 사전설명

1) ast 모듈 설명

ast 모듈은 별도 설치가 필요없는 파이썬 내부 모듈이다. 개인적으로 상당히 생소한 느낌을 받았다. 인터넷 검색을 통해 ast모듈을 찾아본 결과 그 개념이 너무 추상적이다.

  • ast 모듈 개념 : 파이썬 응용 프로그램이 파이썬 추상 구문 문법의 트리를 처리하는데 도움을 줌

하아~ 깊은 한숨이 나온다. 파이썬 추상 구문 문법의 트리를 처리하는데 도움을 준다는 것이 어떤 말인지 굳이 이해하고 싶지는 않다. 나에게 필요한건 저 모듈을 어디에 어떨 때 활용하는지가 중요하다.

  • ast 모듈 활용 : ast.literal_eval(문자형)의 형태로 활용

ast.literal_eval은 또 무슨 말인가? literal은 문자를 의미하며, eval은 리스트 태형으로 바꾸어 주는 걸 의미한다.

eval 내장함수가 있는데, 굳이 ast.literal_eval을 활용하는 이유는 무엇일까? 하아... 제대로 이해가 안되니 답답하다.

 

아래의 글을 통해 ast.literal_eval 및 eval 내장함수의 차이를 비교해보면, 이해할 수 있을 것 같은데, 상당히 어렵다.ㅠㅠ

 ※ ast_literal_eval 및 eval내장함수 : https://emilkwak.github.io/literal-eval-str-expression

 

뭐, 간단하게 설명하면, 문자형을 리스트 태형으로 바꾸어 준다고 생각하면 될 것 같다.

리스트 데이터가 따옴표(" ") 안에 표현해야 하는 경우가 있다. 딕셔너리 내 키값(key)으로 리스트 태형의 데이터가 존재하는 경우를 말한다.

aaa = {'[1,2,3]' : 1}

 

필자는 위와 같이 딕셔너리 형태일 때,  ast.literal_eval 모듈은 딕셔너리 형태로 이루어진 리스트의 키 값을 추출할 때 사용하려고 한다.

 

2) '리스트' 태형은 문자형이다.

아래와 같이 딕셔너리 형태의 리스트(keys) 및 1(values)을 구해보자. 밸류(values) 값을 구하는 것은 의외로 쉽다.

형태를 보자. 딕셔너리(aaa) 안에 대괄호를 치고, 키값('a')를 입력하니, 숫자 1인 출력되었다.

aaa = {'a' : 1}
print(aaa['a'])		# 1 출력

 

위의 경우를 응용해보자. 

ccc = {'[1,2,3]' : 2}
print(ccc['[1,2,3]'])		# 2가 출력된다

 

 

한편, 경우에 따라 키값을 '리스트' 형으로 써주어야 할 때가 있다. 우리가 착각하기 쉬운 것은 '리스트'는 어떤 태형일까? 리스트에 작은 따옴표를 붙임 형태이다. 결론은 '리스트'는 문자형이다.

bbb = '[1,2,3,]'
print(type(bbb))		# <class 'str'>로 출력된다.

 

 


3. 코드설명

자, 우리는 ast.literal_eval 모듈을 통한 결과를 확인하고 싶다. 딕셔너리 내 키값인 '리스트'를 추출하고 싶다는 것이다. (딕셔너리 형태의 values 값이 아니다)

 

1) 1차 시도 (실패)

aaa = {'[1,2,3]' : 4}       
print(aaa['[1,2,3]'])		# values 값인 4가 출력된다.

aaa = aaa.keys()			# keys 값을 추출하기 위한 시도이나, 실패이다.
print(aaa)					# dict_keys(['[1,2,3]']) 출력된다.
print(type(aaa))			# <class 'dict_keys'>

 

위에서 확인하였듯이, values가 4인 key값 [1,2,3]을 얻고 싶었으나, 위의 방법은 실패하였다. 출력값이 [1,2,3]의 리스트 태형을 얻고 싶었다.

 

2) 2차 시도 (실패)

2차 시도로 아래의 4줄의 aaa 앞에 list를 넣어주어 1줄에서 딕셔너리 형태(aaa)를 넣어주고, 첫번째 요소([0])를 추출한다. 5줄에서 [1,2,3]으로 출력되었으나, 태형이 문자형(str)이다. 즉, 위에서 설명하였지만, '[1,2,3]'의 문자형이다.

 

aaa = {'[1,2,3]' : 4}
print(aaa['[1,2,3]'])		# values인 4가 출력된다.

aaa = list(aaa)[0]
print(aaa)					# [1,2,3] 출력된다.
print(type(aaa))			# <class 'str'> 출력된다.

 

3) 3차 시도 (성공)

아래의 4줄에서 리스트 태형으로 바꾸어주고 첫번째 요소를 추출한다. 4줄에서 추출한 첫번째 태형은 '[1,2,3]' 문자형이다. 이 문자형을 5줄의 ast.literal_eval을 통해 리스트 태형으로 바꾸어준다.

 

우리가 알 수 있는 확실한 것은 ast.literal_eval은 그 이름(literal_eval)에서 알 수 있듯이 문자형(literal)을 리스트 태형(eval)로 바꾸어 준다는 것을 알 수 있다.

aaa = {'[1,2,3]' : 4}
print(aaa['[1,2,3]'])			# values인 4가 출력된다.

aaa = list(aaa)[0]				# 1줄의 딕셔너리 태형을 리스트태형으로 바꾸어주고, 첫번째 요소를 추출한다.
aaa = ast.literal_eval(aaa)		# 4줄의 문자형인 aaa를 리스트 태형으로 바꾸어준다.

print(aaa)						# [1,2,3]을 출력한다.
print(type(aaa))				# <class 'list'>을 출력한다.

 


4. 마치며

ast.literal_eval을 통해 딕셔너리의 키값에 있는 '리스트'의 문자형을 리스트 태형으로 바꾸는 방법을 알아 보았다. 개인적으로 ast.literal_eval 함수는 잘 안 쓸거 같다. 문자형을 리스트 태형으로 바꾸는 방법이 링크에서는 약간의 위험은 있지만, 생소하다고 해야할까? 앞으로 큰 무리가 없으면, eval을 통해 문자형을 리스트 태형으로 바꿀 것이다.

 

코드를 배울 때, 호기심 혹은 의구심이 내 능력 증진에 도움이 된다고 생각한다. "여기서 왜 이 코드를 썼을까, 이 함수는 무엇일까?" 끊임없이 생각하고 고민해보아야 한다. 아직은 부족한 코드 실력이다. 한계단씩 천천히 올라가다보면, 언젠가는 해선에서 안정적인 수익을 얻을 수 있을 것이라 기대해본다. ^^;

 

 

반응형