【问题标题】:Why are extension attributes inaccessible in python protobuf objects?为什么在 python protobuf 对象中无法访问扩展属性?
【发布时间】:2018-11-14 15:46:04
【问题描述】:

我正在尝试用 Python 读取和分析来自纽约地铁的 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() 中是可访问的,但由于它返回一个 (name, attribute) 对的列表,所以访问它充其量是尴尬的。

为什么不能像其他属性一样通过点访问来访问扩展中的属性?有没有比使用 ListFields 更好或更优雅的方式来访问它们?

【问题讨论】:

  • 使用 protobuf 读取 GTFS 提要而不是例如谷歌的transitfeed包github.com/google/transitfeed? AFAIK GTFS 本质上是一种 CSV 文件格式。
  • 您对 GTFS 的看法是正确的 - 它通常以静态 CSV 格式提供。不过,问题是关于 GTFS-realtime - 一个相关但独特的使用 protobuf 的实时交通信息标准。见developers.google.com/transit/gtfs-realtime

标签: python protocol-buffers gtfs


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-12
    • 2011-07-05
    相关资源
    最近更新 更多