목 차
1. 들어가며
2. 에러발생 원인
3. 해결 방법
4. 마치며
1. 들어가며
바이비트 API를 통해 주문을 넣고 취소를 하는 과정에서
아래와 같은 오류메시지가 나왔다.
TypeError: list indices must be integers or slices, not str
타입에러 : 리스트 인덱스는 정수나 슬라이스 형, 문자형이 아님
→ 리스트형을 문자형으로 추출할 때 발생하는 오류이다.
(리스트는 정수/슬라이스 형으로 추출해야 함)
2. 에러발생 원인
1) 데이터 확인
바이비트 서버에서 받아온 데이터는 리스트형과 딕셔너리형으로 섞여 있다.
{'data': [{'user_id': 0000000, 'symbol': 'BTCUSD', 'side': 'Sell', 'order_type': 'Limit', 'price': '21000', 'qty': '1 ......} ] }
{ [ { } ] } 형태이다.
→ 대분류(가장 바깥쪽)는 딕셔너리 형태이며,
중분류는 리스트, 소분류(가장 안쪽)은 딕셔너리 형태이다.
* 'user_id'는 고유번호로서, 바이비트에서 받아오는 정보이나, 음영처리함
아래 <그림2>를 실행하면, 20번째 줄에서 위와 같은 에러가 난다. (price)
→ 그림만 참고하자.
※ 물론, 지금 사용자의 pc에서는 실행되지 않는다.
이유는? 바이비트 api 설치, api_key 및 api_secret를 발급받고,
주문이 이미 들어가 있어야 한다.
2) 딕셔너리 및 리스트형의 자료 추출 형태
받아오는 데이터의 태형(type)를 꼼꼼히 확인할 필요가 있다.
딕셔너리 - 리스트 - 딕셔너리 형태로 받아온다.
여기서 핵심은 딕셔너리는 문자형으로 값을 추출하여야 하고,
리시트형은 정수형 혹은 슬라이이스 형으로 추출한다는 것이다.
즉, 위의 에러는 '리스트형의 데이터'를 '딕셔너리형의 데이터' 형식으로 추출하려고 할 때 발생하는 오류이다.
3. 해결 방법
아래 <그림3> 23줄에서 확인하였듯이,
리스트형[0]으로 먼저 받아주고, 딕셔너리['price] 형태로 받아주면 된다.
(받아온 청산 가격 21000이 문자형(str)인게 특이하다. 가격이니깐 int형 인줄 알았다)
즉, <그림3>에서 확인하였듯이 바이비트 api를 통해
- 15줄 : 받아온 데이터는 딕셔너리 형태이기 때문에 ['result'] 문자형으로 받았고
- 19줄 : result 안에는 딕셔너리 형태이기 때문에, ['data'] 문자형로 값을 추출하고
- 23줄 : data안에는 리스트 형태로 되어 있기 때문에, 첫번째 변수를 받기 위해서는 [0]인 숫자로 받고,
- 23줄 : 리스트 형태의 첫번째 변수는 딕셔너리 형태로 이루어졌기 때문에 ['price'] 문자형으로 받는다.
4. 마치며
이번 오류 해결을 통해 알게 된건,
딕셔너리는 문자형으로 값(values)을 얻어오고,
리스트형은 숫자형으로 값(values)로 얻어온다는 것을 알았다.
데이터를 받아올 때, 데이터를 묶어오는 형태를 유심히 관찰해야겠다.
데이터를 다룰 때 그 형태에 좀더 많은 관심을 갖도록 하자.