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

네, 없습니다.. ㅡ,.ㅡ;

 

전통적인(?) 많은 개발 언어에서 <증감연산자>를 사용해 왔습니다.

++ 혹은 -- 로 표기되는 <증감연산자>는 <3항 연산자>와 마찬가지로

코드의 양을 많이 줄여줄 수 있는 장점이 있어 널리 사용됩니다.

 

가령 아래의 코드와 같은 방법으로 반복문에서 많이 사용되고 있고

반복적인 작업을 처리하는 로직 내에서도 ++ 혹은 -- 로 

카운트의 값을 변경하는 목적으로 널리 애용되고 있습니다. 

 

for (int i=0; i<100; i++) {}

 

그런데!

 

Python 에서는 <증감연산자>가 사용되지 않고 존재하지 않는다는 사실.

오랫동안 Python 을 다뤄오신 분들에게는 "당연한거 아니야?" 라는 반응이 나오겠습니다만

어쩌다 한 번 Python 으로 코드를 만들어야 하는 일이 생기는 분들이라면

존재하지 않는 <증감연산자>에 당황할 수 있습니다... 네, 제가 그랬으니 이 글을 쓰고 있...

Python 에는 아래와 같은 방식으로 for 문을 대체하는 것이 일반적이더군요.

 

for i in range (0,99):
	# blah blah...

 

 

반복문이 아닌 경우에는 어떻게 하면 될까요?

갑자기 쓰려니 공식 명칭이 떠오르지 않습니다만 += 나 -= 는

다른 언어에서와 마찬가지로 Python 에서도 사용되는 연산자입니다. 

 

# 다른 언어
i++;
i--;
++i;
--i;

# Python
i += 1
i -= 1

 

Python 은 누구나 쉽게 읽을 수 있고 명료한 코드를 추구한다고 합니다.

<증감연산자>는 분명 간편하지만 전위인지, 후위인지에 따라

실제 값이 어느 타이밍에 바뀌느냐로 굉장히 골머리를 썩었던 경험들이 다들 있을겁니다.

C 언어에서의 포인터 급은 아니지만 처음 개발에 입문할 때 꽤 많은 오류를 만들었던 기억이 납니다.

혹시나 생길 수 있는 코드 해석의 차이를 없애주는 착한 Python 입니다. 

 


 

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

COUPANG

www.coupang.com

 

Visual Studio Code 에서 Python 패키지의 Unresolved Import Error 를 처리하는 방법

코드를 만들 필요가 있을때 왠만하면 Node.js 를 이용하는 편입니다. 아무래도 익숙하기도 하거니와 자유로운 자바스크립트의 DNA 가 살아 있기 때문에 "대략 이렇게 돌아갈까?" 하는 것들이 동작하기 때문입니다...

ondemand.tistory.com

 

맥에서 파이썬 개발환경 준비하기

파이썬은 2.x 대와 3.x 대가 있는데, 서로 호환성이 없음 일반적으로 많이 사용되는 2.x 대를 설치 - 설치안내 : http://python.org/download/releases/2.7.6/ 파이썬 패키지 관리도구 : easy_install, pip pip 는..

ondemand.tistory.com

 

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

 

728x90
728x90

코드를 만들 필요가 있을때 왠만하면 Node.js 를 이용하는 편입니다. 아무래도 익숙하기도 하거니와 자유로운 자바스크립트의 DNA 가 살아 있기 때문에 "대략 이렇게 돌아갈까?" 하는 것들이 동작하기 때문입니다. 하지만 환경에 따라서 특정한 언어를 사용해야 하는 경우에는 그 환경에 맞출 수 밖에 없는 경우도 생깁니다.

 

근래에 회사에서 제공하는 함수형 플랫폼을 사용하려다보니 (AWS 의 람다와 무척 비슷합니다) Python 을 사용할 일이 조금 생기고 있습니다. 본격적으로 다뤄본 언어도 아니고 개발환경도 익숙하지 않아 시행착오가 많이 생기고 있습니다. 오늘 만난 문제는 Visual Studio Code 에서 Python 을 사용할 때 발생하는 Unresolved Import Error 에 대한 이야기 입니다. 

 

vscode 에서 만난 생소한 너란 녀석!

첫번째 방법

python 환경에 익숙하지 않다 보니 사실 python 2.x 와 python 3.x 가 공존하는 것도 사실 좀 생소합니다. pip도 2.x 와 3.x 용을 따로 사용하고 있고 python 환경에서 코드를 구동할 때 어떤 버전의 환경에서 구동되는 것인지 헷갈릴 때가 많습니다. 어찌되었건 돌아가는 환경이 준비되면 필요한 코드를 만드는데 집중하는 식이긴 하지만 여러가지로 찜찜한게 현실입니다. 물론... 이 현실을 타개할 것이냐는 다른 이야기죠 ㅎㅎ

 

오늘 새로운 코드 작업이 필요하여 저장소를 만들고 기존에 만들었던 코드를 기반으로 보일러 플레이팅하여 코드 작업을 시작했습니다. 그런데 왠지 모르게 계속 import 구문에서 가져온 모듈에 물결표시가 생기면서 unreolved import warning 에러가 눈에 띄었습니다. 코드는 동작하긴 하는데 vscode 에서 자동완성 같은 기능들이 삐그덕 거리는 느낌이 들었습니다. 수소문해보니 해결 방법은 여러가지이지만 가장 간단했던 방법을 소개합니다. 

 

1) Ctrl + Shift + P 혹은 Cmd + Shift + P 를 누릅니다.

2) 창에 Python Select Interpreter 를 입력하고 선택합니다

 

3) 사용중인 Python 버전에 맞는 경로를 선택해 줍니다

 

이렇게 하면 vscode 에서 거슬리는 unresolved import warning 을 없앨 수 있습니다. 이렇게 지정한 Python 경로는 vscode 의 개별 과제별 환경 파일인 .vscode 경로 하위의 settings.json 에 기록됩니다. 거꾸로 얘기하면 이 파일을 직접 수정해도 동일한 효과를 얻을 수 있다는 말입니다. 저라면 Cmd + Shift + P 를 이용하는 방법을 계속 쓸 것 같습니다 ㅎㅎ

 


두번째 방법

위와 같이 해결되었다면 다행이지만 그렇지 못한 경우도 가끔 생깁니다. 이 때는 Visual Studio Code 의 인텔리센스 관련한 기능 동작에 문제가 있는 것일수도 있습니다. VIsual Studio Code 에서 문제가 되는 프로젝트를 열어둔 상태에서 Shift - Command - P 를 누릅니다. (윈도우에서는 Shift - Ctrl - P 일까요? 윈도 쓴지가 오래되서... ㅜㅜ) 

 

화면에 검색창이 나오면 Language Specific 이라고 치고 자동 완성되 목록에서 (아마도) 첫번째 항목인 "Configure Language Specific Settings..." 를 선택해 줍니다. 곧바로 사용중인 언어를 선택하는 창이 나옵니다. python 을 입력하여 python 으로 언어를 선택하겠습니다.  그러면 settings.json 파일이 로드되는 것을 확인할 수 있습니다. 

 

 

이때 열리는 settings.json 파일은 프로젝트와 관련된 파일이 아니고 Visual Studio Code 의 언어별 기본 설정입니다. 이 파일의 내용들 중 인텔리센스와 관련된 항목을 발견할 수 있는데요, 이 항목을 과감히 삭제하고 저장해 줍니다. 제 경우에는 "python.jediEnabled" 항목을 통째로 날려주었습니다 :-)

이제 프로젝트를 열어둔 Visual Studio Code 창을 닫고 다시 프로젝트를 열어보겠습니다. (아마도) Unresolved Import Error 가 사라졌을겁니다. 후훗.

 

 

[ 혼공파 - 게으른 저는... 사두고 보진 않습니다만... 여러분들은 잘 하실겁니다 ]

 

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

COUPANG

www.coupang.com

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

728x90
728x90

이유는 알 수 없습니다만 여러곳에서 지속적으로 사용자 유입이 되고 있는 포스팅이 "JSON 포맷에서 주석을 사용할 수 있을까?" 라는 글입니다. 유입이 많은 이유로 생각되는 것은 많은 분들이 JSON 포맷을 사용하면서 주석 사용에 대한 욕망(?)이 있고, 이에 대한 방법을 찾으려다 검색 유입이 되는 것이라는 생각이 듭니다. 저 역시 글을 쓴 이유가 JSON 포맷에서 주석을 왜 쓸 수 없을까 였기 때문에 결국 같은 갈망을 가지고 검색후 실망-_-이라는 수순을 밟고 있는 안타까운 현실이라 하겠습니다.



요즘 읽고 있는 책 중 하나가 제이펍에서 출간한 "자바스크립트와 Node.js 를 이용한 웹 크롤링 테크닉"(책 내용 자세히 보기 [바로가기]) 이라는 책입니다. 곧 이직을 계획하고 있어서 여유 시간을 알차게 활용하고자 Node.js 와 파이썬(Python), 그리고 인프라스트럭쳐 배포 자동화에 심취해 있는데요, 여튼 이 책을 읽던 중 JSON5 에 대한 정보를 습득하게 되어 간단하게 공유해 보고자 합니다. 



JSON5 (http://json5.org) 는 JSON 이 가지고 있는 몇 가지 단점들을 ECMAScript 표준의 진화에 맞추어 쓸만한 형태로 개선하고자 하는 일종의 제안으로 시작된 프로젝트입니다. 시작된지는 좀 된 과제이지만 여전히 가야할 길을 열심히 걷고 있는 과제이기도 합니다. JSON5 는 JSON 의 규격을 조금 더 완화시키고 유연하게 만들어 다양한 데이터 포맷을 수용하고, 사람들에게도 더 친숙한 (= 주석으로 지저분해지는?) 형태로 만드는 것을 목적으로 하고 있습니다. JSON5 포맷으로 구성한 데이터 포맷의 예를 살펴보면 변화하는 부분을 쉽게 인지할 수 있습니다.



글의 시작에 이야기 했던 주석은 한줄 주석, 혹은 여러 줄로 구분된 주석 형태를 제공하고 있습니다. Key 를 표현할 때 꼭 사용해야 했던 따옴표 역시 제거되어 key 입력에 대한 불편함이 사라졌고, 파싱 에러의 대부분을 차지하고 있는 콤마에 대한 사용도 완화되어 어레이의마지막에 콤마가 들어가도 무방하도록 변경되었습니다. Value 에 멀티라인 텍스트가 들어갈 수 있는 것도 고무적인 부분입니다. 그 외에 Hex 형태의 표현 허용, 소수점 이하 표기법의 자유도 등도 눈에 띄는 부분입니다. Node.js 를 사용하는 경우 npm 을 통해서 json5 모듈을 쉽게 다운로드 받아 사용해 볼 수 있습니다.


$ npm install json5


모듈이 설치되면 Require 문으로 json5 모듈을 불러와야 한다는 점을 제외하면 parse 와 stringify 메소드를 이용해서 기존 JSON 내장 객체처럼 사용할 수 있습니다. 간단한 Node.js 예제코드는 아래와 같습니다.


var JSON5 = require('json5');

var fs = require('fs');

var json5 = fs.readFileSync("data.json5", "utf-8");


var obj = JSON5.parse(json5);


console.log(obj);

console.log(obj.multi_line);

console.log(obj.hex_data);

console.log(obj.items);


당연한 것이겠지만 JSON5 를 이용하여 데이터를 주고 받을 각 주체들은 JSON5 를 지원할 수 있도록 준비되어야 합니다. Node.js 이외의 다른 언어에서도 미리 준비된 패키지가 있을 것으로 생각됩니다만, 규격의 변경에 따른 사용 가능 여부를 확실히 점검하고 넘어가는 것이 좋을 것 같습니다. 주석을 이용할 수 있다는 것은 분명 의미있는 변화이지만 이로 인해 증가할 수 있는 데이터 파일의 크기, 새로운 처리 모듈의 사용 등은 고민을 해봐야 할 부분입니다.


/* 추천도서 */ API 설계 실무에 바로 사용하는 JSON [자세히 살펴보기]






728x90

+ Recent posts