728x90

JSON 으로 데이터를 표현하는 것은 굉장히 일반화 되어 있습니다. 많은 API 의 응답이 JSON 형태를 가지고 있을 뿐만 아니라 서버의 설정이나 개발된 코드의 환경 정보도 JSON 으로 쓰는 경우가 많습니다. 하지만 JSON 이 정말 편안한 형태인가? 에 대해서는 쉽게 고개를 끄덕이긴 어렵습니다. 파싱(Parsing) 하는 과정이 은근 까다로울때가 많고, 특히 JSON 이 중첩되어 있을 경우에는 더욱 그렇습니다. 

파이썬에서 requests 모듈을 이용하여 JSON 으로 응답하는 API 를 호출하기 위하여 아래와 같이 간단한 코드를 만들었습니다. 응답 결과가 JSON 이기 때문에 응답에 대하여 JSON 으로 쉽게 읽을 수 있겠지? 하는 마음에 json() 메서드를 호출해서 변수에 담았습니다. 

import requests
import json

_target = "https://www.example.com/api"
s = requests.Session()
result = s.get(_target).json()

데이터는 JSON 의 모습이지만 이 자료가 어떤 형태인지는 type 으로 찍어보거나 requests 모듈의 문서를 찾아서 json() 메서드의 자료형을 살펴봐야 합니다. 간단히 코드를 만들어서 확인해보니 문자열 형태가 아닌 Dictionary 형태의 자료였습니다. print 문 등으로 출력을 해보면 마치 JSON 처럼 생긴 결과가 나오지만 JSON 의 규격과 맞지 않아 JSON Validator 를 이용해보면 파싱이 제대로 되지 않습니다.

여기서 또 한가지의 문제는 이 응답 결과를 for 문으로 이용하는 코드를 만들었을 때 생깁니다. Dictionary 형태의 데이터였지만 특정 Key 의 값을 꺼내어 확인해보면 Dictionary 가 아닌 List 형으로 변경된 것을 알 수 있습니다. 자료형이 어떻게 바뀌어 가는지를 제대로 가늠하지 못하고 코드를 만들다 보니 한참을 헤메일 수 밖에 없었습니다. 결과에서 특정한 값이 필요할 때는 Dictionary 가 편하지만 Javascript 등에서 JSON 을 필요로 할 때는 문자열 형태로 전달해서 JSON 으로 파싱할 수 있도록 해주는 것이 좋습니다. 

result = s.get(_target).json()
print(type(result))             # DICT
result_json = json.dumps(result)
print(type(result_json))        # JSON
result_dict_again = json.loads(result_json)
print(type(result_dict_again))  # DICT

json 모듈이 제공하는 json.dumps() 메서드는 자료형을 JSON 형태로 (단순 문자열입니다!) 바꿔주는 역할을 하고, json.loads() 메서드는 문자열 자료를 파싱하여 Dictionary 의 Key, Value 형태로 변경해줍니다. 파이썬 내에서 자료를 핸들링 할때는 Dictionary 를 이용하고 외부로 전달할 때는 JSON 형태로 쉽게 바꿀 수 있게 되었습니다. 오늘도 파이썬 초보는 이렇게 한가지를 또 배워갑니다. 


사놓고 보지 않는 혼공파... 틈틈히 읽어야겠습니다 ㅜㅜ (반성..반성..)

 

 

혼자 공부하는 파이썬:파이썬 최신 버전 반영

COUPANG

www.coupang.com

 

Python 에서 선언되지 않은 변수를 처리하는 방법

언어마다 선언되지 않은 변수를 처리하는 방법들이 조금씩 다른 것 같습니다. 가령 Javascript 에서는 변수가 선언되지 않았을 때 undefined 인지를 확인하는 방법으로 선언되지 않은 변수를 조건문에서 확인하는..

ondemand.tistory.com

 

Python 프로젝트의 Package 를 쉽게 추출하고 설치하기

Python 을 조금씩 좋은 감정으로 알아가고 있는 중입니다. 결실을 맺게 될지는 잘 모르겠지만 오늘도 새롭게 공부한 것들이 있어서 공유해 봅니다. Python 에서 Package 관리를 위해 사용하는 것이 pip 혹은 pip3..

ondemand.tistory.com

본 포스팅은 소정의 수수료를 지급받을 수 있습니다

728x90
728x90

서버에 ssh 로 접근하기 위한 인증서 파일이라던가 크리덴셜 정보는 닷(.)으로 시작하는 숨김 폴더에 저장하는 경우가 많습니다. 터미널에서는 기본적으로 이런 숨김 폴더를 쉽게 볼 수 있기 때문에 문제가 없습니다. 하지만, finder 를 이용해서 파일의 위치를 옮기거나 하는 작업이 필요한 경우 숨김 폴더가 보이지 않아 당황하는 경우가 간혹 생기죠. 

 

 

macOS 버전에 따라 방법이 조금씩 다르지만 최근의 버전을 사용하고 있다면 finder 창에서 간단히 <shift+cmd+.> 의 키 조합을 눌러주는 것만으로 숨김파일/폴더를 볼 수 있습니다. 할 때마다 까먹고, 또 누군가는 저처럼 어떻게 하는지를 찾으실 것 같아서 기록으로 남겨봅니다. 할때마다 새로운 기분이고 재미있다는 JS Park 님의 인터뷰가 떠오르는 아침입니다. 

 

 

혹시 위의 방법이 적용되지 않는 오래된 버전의 Mac 을 사용하고 있다면 아래의 포스팅을 참고해 보시기 바랍니다. 예전에는 정말 번거로운 방법으로 숨김파일이나 폴더를 볼 수 있었으니... macOS 는 느리지만 계속 진화하고 있습니다 ^^;;

 

 

맥(Mac) 파인더(Finder)에서 숨김파일 표시 활성화하는 방법

회사에서 지급받은 맥북에어(MacBook Air)가 3년을 넘기면서 슬슬 배터리 광탈 현상을 보이기 시작했습니다. 아직 회사에서 터치바(Touch Bar)가 내장된 신형 맥북을 지급하고 있지 않아 노트북 교체 신청을 할까..

ondemand.tistory.com

 

728x90
728x90

 

언어마다 선언되지 않은 변수를 처리하는 방법들이 조금씩 다른 것 같습니다.

가령 Javascript 에서는 변수가 선언되지 않았을 때 undefined 인지를 확인하는 방법으로

선언되지 않은 변수를 조건문에서 확인하는 방법을 많이 사용합니다.

(물론, 이는 Javascript 의 구조적인 특성에서 기인한 부분이라 좀 특별하긴 하죠)

오래전의 기억을 더듬어 보면 C# 의 경우 null 등으로 비교할 수 있었던 것 같습니다. 

 

Python 에서 코드를 만들다 선언되지 않은 변수를 처리하려다 보니

익숙한 다른 언어들하고는 조금 다르게 접근을 해야하는 것 같더군요.

물론 문제를 해결하기 위해 몇 가지 검색을 해본 것이라 다른 더 좋은 방법이 있을수도 있습니다. 

 

# try~except 를 이용하는 방법
try:
	target_list
except NameError:
	target_list = None
    
if target_list = None:
	# do something if it's not defined
else:
	# do something with variable
	

 

첫번째로 찾은 방법은 Exception 을 이용하는 것이었습니다.

Python 에서는 명시적으로 선언되지 않은 변수를 찾는 Method 가 없다고 합니다.

try~except 문을 이용하여 변수가 선언되지 않았을 때, 특별한 예약 값 None 을 넣고 if 문을 활용하는 방법입니다.

훌륭해 보이긴 하는데 왠지 코드의 가독성이 좋은 느낌은 아닙니다.

try 구문에 # do something if it's not defined 에 구현할 내용을 넣으면 조금 나아질 수는 있겠죠?

 

# locals(), globals() 를 뒤져보기
if 'target_list' not in locals():
	# do something if target_list is not exist
else :
	# do something with target_list

 

다른 방법은 Python 의 변수 특성을 이용하는 방법입니다.

Python 에서 변수가 선언되면 지역 변수냐 글로벌 변수냐에 따라

locals() 와 globals() 함수가 리턴하는 결과를 이용하여

이미 선언된 변수인지 아닌지를 확인해 볼 수 있습니다.

 


더 좋은 방법이 있다면 파이썬 알못인 저에게 도움 부탁드리겠습니다!
어찌저찌 돌아가기만 하는 코드는 왠지 찝찝하니까요!

728x90
728x90

pip 가 참 많은 일을...

 

Python 을 조금씩 좋은 감정으로 알아가고 있는 중입니다. 결실을 맺게 될지는 잘 모르겠지만 오늘도 새롭게 공부한 것들이 있어서 공유해 봅니다. Python 에서 Package 관리를 위해 사용하는 것이 pip 혹은 pip3 입니다. npm 과 같은 Package 관리자라고 생각하니 마음이 편해졌습니다.

 

npm 에서는 프로젝트 루트 경로의 package.json 에 패키지를 기술해두고 npm install 명령으로 패키지를 쉽게 설치할 수 있었는데요, pip 에는 그런 기능이 없나 하고 살펴보니 역시나 제공하고 있었습니다. 당연한 것을 이렇게 하나씩 알아가는 것도 새로운 개발 환경을 익히고 배우는 재미이겠지요.

 

// 패키지의 목록을 출력
$ pip freeze
boto3==1.12.24
botocore==1.15.24

// 패키지의 목록을 requirements.txt 에 저장
$ pip freeze > requirements.txt

 

먼저 pip 의 freeze 를 이용하여 사용중인 패키지를 확인할 수 있습니다. 가상 환경을 적절히 분리해 두지 않았다면 전역으로 설치된 모든 패키지의 목록이 나오는 것처럼 보입니다. 아직 Python 가상환경에 익숙치 않아서... 대충 그렇게 돌아가는 것처럼 보이는 느낌입니다 ㅎㅎ.

 

$ pip install -r requirements.txt

 

requirements.txt 파일은 `패키지명=버전` 혹은 `패키지명` 으로 패키지에 대하여 기술한 목록 파일입니다. NodeJS 에서는 package.json 에 JSON 형태로 모듈명과 버전명을 기술했던 것에 비해 단순합니다. pip install 명령을 -r #패키지목록# 형태로 실행하면 지정되어 있는 패키지의 버전을 찾아 설치하게 됩니다. 참 쉽죠? 

 

 

728x90

+ Recent posts