Я использую Raspberry Pi 3 для вызова транзитного API MBTA и получения обновленной информации для идентификаторов остановок. У меня есть код, который вызывает API и извлекает данные идентификатора остановки. У меня все это работало раньше, еще несколько дней назад. Проблема только с Красной линией для МБТА. Но когда я запускаю свой скрипт, он выдает это сообщение об ошибке.
Traceback (most recent call last):
File "APItest.py", line 23, in <module>
currentstop[i] = stop_name(test[i]['id'])
TypeError: 'NoneType' object is not subscriptable
Для меня это странно, потому что это работает, когда я вызываю места остановки синей линии, я вообще не меняю код, кроме API, который вызываю. Я публикую код Python 3 ниже. Это призыв к красной линии. Единственное, что я меняю при вызове синей линии, это меняю переменную «line» на «Blue».
import requests
import json
from APIstops import stop_name
APIkey = '--------------------------' # My personal API access Key
line = 'Red' # Line will be testing with first
URL2 = "https://api-v3.mbta.com/vehicles?filter[route] = " + line + "&api_key = " + APIkey # URL for calling red line specific
vehicles = requests.get(URL2) # gets vehicle data from API
dataV = vehicles.text # converts to text
parse_json = json.loads(dataV) # parses data to JSON format
MBTAV = parse_json['data'] # creates array of parsed data
vehicle_locals = dict() # creates a dictionary of current location of red line vehicles
test = dict()
for vehicle in MBTAV:
vehicle_locals[vehicle['id']] = vehicle['relationships']['stop']['data'] # stores current stop for each train per given line
#print(vehicle_locals)
for i in range(0 , len(vehicle_locals)):
test[i] = list(vehicle_locals.values())[i]
print(test[0]['id'])
currentstop = [None] * len(vehicle_locals)
for i in range(0, len(vehicle_locals)):
currentstop[i] = stop_name(test[i]['id'])
print(currentstop)
Я не знаю, почему это работает для синего, а не для красного. Я посмотрел на API, и они оба выглядят одинаково.
Честно говоря, я не знаю, что еще попробовать.
URL-адрес API MBTA для красной линии
https://api-v3.mbta.com/vehicles?filter[route]=Red
URL-адрес API MBTA для синей линии






Просто: иногда данные stop транспортного средства "stop":{"data":null}:

Итак, в словаре у вас окажется None, и пытаться поработать над этим бесполезно.
После некоторого упрощения и добавления фильтрации ваш сценарий становится
import requests
APIkey = "..." # My personal API access Key
line = "Red" # Line will be testing with first
resp = requests.get(
"https://api-v3.mbta.com/vehicles",
params = {
"filter[route]": line,
# "api_key": APIkey, # uncomment if you have an API key
},
)
resp.raise_for_status()
MBTAV = resp.json()["data"]
vehicle_locals = {
vehicle["id"]: vehicle["relationships"]["stop"]["data"]
for vehicle in MBTAV
if vehicle["relationships"]["stop"]["data"] is not None
}
print(vehicle_locals)
и результаты
{
"R-547CC0EE": {"id": "70094", "type": "stop"},
"R-547CC0E0": {"id": "70088", "type": "stop"},
"R-547CC0D8": {"id": "70089", "type": "stop"},
"R-547CBFEF": {"id": "70077", "type": "stop"},
"R-547CBFA0": {"id": "70071", "type": "stop"},
"R-547CBF3F": {"id": "70064", "type": "stop"},
"R-547CBD8D": {"id": "70065", "type": "stop"},
"R-547C9415": {"id": "70072", "type": "stop"},
"R-547C5517": {"id": "70078", "type": "stop"},
}
(У меня нет вашего модуля APIstops и, следовательно, вашей функции stop_name(), поэтому она исключена отсюда.)
Ошибка сообщает вам, что
test[i]естьNone(окольным путем. На самом деле это вы используете оператор индекса[...]для чего-то, что не является словарем), поэтому: напечатайтеtest, чтобы узнать, какие элементы находятся там после ты заполняешь его.