为什么在python protobuf对象中无法访问扩展属性?

时间:2018-11-14 15:46:04

标签: python protocol-buffers gtfs

我正在尝试使用Python从NYC地铁中读取和分析GTFS实时数据。到目前为止,我已经成功地使用gtfs-realtime.protonyct-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 :(得分:1)

通过对象的Extensions属性访问扩展名(请参见docs)。例如。 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