Как установить поле метки времени protobuf в python?

#python #protocol-buffers

#python #протокол-буферы

Вопрос:

Я изучаю использование буферов протокола и хотел бы использовать новый тип данных метки времени, который находится в protobuf3. Вот мой файл .proto:

 syntax = "proto3";

package shoppingbasket;

import "google/protobuf/timestamp.proto";

message TransactionItem {
  optional string product = 1;
  optional int32 quantity = 2;
  optional double price = 3;
  optional double discount = 4;
}

message Basket {
  optional string basket = 1;
  optional google.protobuf.Timestamp tstamp = 2;
  optional string customer = 3;
  optional string store = 4;
  optional string channel = 5;
  repeated TransactionItem transactionItems = 6;
}

message Baskets {
  repeated Basket baskets = 1;
}
 

После генерации классов python из этого файла .proto я пытаюсь создать некоторые объекты, используя сгенерированные классы. Вот код:

 import shoppingbasket_pb2
from google.protobuf.timestamp_pb2 import Timestamp

baskets = shoppingbasket_pb2.Baskets()
basket1 = baskets.baskets.add()
basket1.basket = "001"
basket1.tstamp = Timestamp().GetCurrentTime()
 

сбой с ошибкой:

Ошибка атрибута: недопустимо присвоение составному полю «tstamp» в объекте сообщения протокола.

Кто-нибудь может объяснить мне, почему это не работает, поскольку я в замешательстве.

Ответ №1:

См. Timestamp .

Я думаю, вы хотите:

 basket1.tstamp.GetCurrentTime()
 

Комментарии:

1. Этот API — это катастрофа, .GetCurrentTime() устанавливает значение? что ?!

Ответ №2:

Вы также можете проанализировать его:

 Timestamp().FromJsonString("2022-03-26T22:23:34Z")