2016-01-30 9 views
-2

Привет, у меня есть проблема с моим кодом, что я получаю ошибку в цикле, которая работает несколько раз, но затем бросает мне строку типа: строковые индексы должны быть целыми числами. Я хочу вызвать api, чтобы вернуть json и получить некоторые части ответа json. Heres код:TypeError: строковые индексы должны быть целыми числами

class API(object): 

    def __init__(self, api_key): 
     self.api_key = api_key 


    def _request(self, api_url, params={}): 
     args = {'api_key': self.api_key} 
     for key, value in params.items(): 
      if key not in args: 
       args[key] = value 
     response = requests.get(
      Consts.URL['base'].format(
       url=api_url 
       ), 
      params=args 
      ) 
     if response.status_code == requests.codes.ok: 
      return response.json() 
     else: 
      return "not possible"    
     print(response.url) 


    def get_list(self): 
     excel = EXCEL('s6.xlsx') 
     api_url = Consts.URL['list'].format(
      version = Consts.API_VERSIONS['matchversion'], 
      start = excel.get_gamenr() 
      ) 
     return self._request(api_url) 


    def get_match(self, matchid): 
     idlist = matchid 
     api_url = Consts.URL['match'].format(
      version = Consts.API_VERSIONS['matchversion'], 
      matchId = idlist 
      ) 
     return self._request(api_url) 


    def match_ids(self): 
     api = API('c6ea2f68-7ed6-40fa-9b99-fd591c55c05f') 
     x = api.get_list()  
     y = x['matches'] 
     count = len(y) 
     ids = [] 
     while count > 0: 
      count = count - 1 
      temp = y[0] 
      ids.append(temp['matchId']) 
      del y[0] 

     return ids 

    def match_info(self): 
     matchids = self.match_ids() 
     print(matchids) 
     matchinfolist = {} 
     counter = 1 
     for gameids in matchids: 
      info = self.get_match(gameids) 
      myid = self.find_partid(info['participantIdentities']) 
      prepdstats = info['participants'][myid-1] 
      print(prepdstats) 
      matchinfolist['stats' + str(counter)] = prepdstats 
     return matchinfolist 


    def find_partid(self, partlist): 
     partid = 0 
     idlist = partlist 
     while partid < 10: 
      partid = partid + 1 
      tempplayer = idlist[0]['player'] 
      if tempplayer['summonerId'] == 19204660: 
       playernr = partid 
       partid = 500 

      del idlist[0] 

     return playernr 

когда я запустить функцию match_info() я получаю эту ошибку

Traceback (most recent call last): 
    File "C:\Users\Niklas\Desktop\python riot\main.py", line 17, in <module> 
    main() 
    File "C:\Users\Niklas\Desktop\python riot\main.py", line 10, in main 
    print(api.match_info()) 
    File "C:\Users\Niklas\Desktop\python riot\api.py", line 78, in match_info 
    myid = self.find_partid(info['participantIdentities']) 
TypeError: string indices must be integers 

, но только после того, как цикл в функции поработает несколько раз. Я понятия не имею, что я делаю неправильно. Любая помощь будет приятной.

Вот ссылка на JSON: https://euw.api.pvp.net/api/lol/euw/v2.2/match/2492271473?api_key=c6ea2f68-7ed6-40fa-9b99-fd591c55c05f

ответ

0

Ошибка появляется на

  myid = self.find_partid(info['participantIdentities']) 

Для этой линии для выполнения, информация должна быть отображение со строковыми ключами, а не сама строка. info является

  info = self.get_match(gameids) 

get_match заканчивается

 return self._request(api_url) 

_request заканчивается

 if response.status_code == requests.codes.ok: 
      return response.json() 
     else: 
      return "not possible"    

Для цикла, чтобы когда-либо бежать, response.json() должен быть ДИКТ с ключом 'participantIdentities'. Ваша ошибка ожидает, что это всегда будет правдой.

Одним из исправлений может быть ожидание всегда. Если есть удовлетворительное значение по умолчанию, верните {'participantIdentities': <default value>}. В противном случае верните None и измените петлю на

  info = self.get_match(gameids) 
      if info is not None: 
       # as before 
      else: 
       # whatever default action you want 
Смежные вопросы