Почему атрибуты расширения недоступны в объектах python protobuf? - PullRequest
0 голосов
/ 14 ноября 2018

Я пытаюсь читать и анализировать данные GTFS в реальном времени из метро Нью-Йорка в Python.До сих пор я успешно использовал gtfs-realtime.proto и nyct-subway.proto для генерации правильных классов Python и анализировал данные protobuf в объекты Python.

Моя проблема возникает при попытке доступа к определенным полям в этих объектах.Например, заголовок (feed.header) выглядит следующим образом:

gtfs_realtime_version: "1.0"
incrementality: FULL_DATASET
timestamp: 1533111586
[nyct_feed_header] {
  nyct_subway_version: "1.0"
  trip_replacement_period {
    route_id: "A"
    replacement_period {
      end: 1533113386
 ...

Я могу получить доступ к первым трем атрибутам, используя точечный доступ, но не nyct_feed_header.Я подозреваю, что это потому, что он является частью nyct-subway.proto расширения, в то время как остальные три являются частью оригинала.

Я нашел этот атрибут доступным в feed.header.ListFields (), но так как это возвращаетсписок пар (имя, атрибут), доступ к которым в лучшем случае неудобен.

Почему атрибуты из расширений не доступны через точку доступа, как и остальные?Есть ли лучший или более элегантный способ доступа к ним, чем с помощью ListFields?

1 Ответ

0 голосов
/ 25 мая 2019

Расширения доступны через свойство Extensions объекта (см. документы ). Например. с GTFS и расширениями NYCT:

import gtfs_realtime_pb2 as gtfs
import nyct_subway_pb2 as nyct

feed = gtfs.FeedMessage()
feed.ParseFromString(...)
feed.entity[0].trip_update.trip.Extensions[nyct.nyct_trip_descriptor].direction
...