1

我无法弄清楚如何在 pycapnp 中实例化 Option(T) 类型。

我试图实例化一条新消息,然后设置“some”的值,但这样做会丢失类型信息。

struct Option(T) {
  union {
    none @0 :Void;
    some @1 :T;
  }
}

struct Something {
  a @0 :Int16;
}
o = Option.new_message()
o.some = Something.new_message(a=5)
o.some.a // throws error

我希望通过添加的结构来键入选项,但是它会丢失所有类型信息,并且我无法访问放置在“某些”联合值中的对象的成员。

4

2 回答 2

0

Cap'n Proto 泛型并非真正设计为以这种方式工作。它们是为静态类型检查而设计的(考虑到静态类型语言,即不是 Python)。泛型类型的实例不能在事后“变成类型化”——该类型必须在构造时静态/已知。

如果未指定类型参数,则假定为AnyPointer. 我相信这意味着您需要some像这样访问:

o.some.as_struct(Something).a

我认为在 Python 中没有办法构造一个在运行时指定类型参数的泛型类型。真正使用泛型的唯一方法是包含类型指定类型参数,例如:

struct ContainingType {
  option @0 :Option(Something);
}

如果您随后构造 aContainingType并访问其option字段,您将获得一个Option知道类型someis的对象Something,而不是AnyPointer

于 2019-08-01T17:29:16.580 回答
0

我想提供一个例子来说明我是如何工作的:

struct Request(PayloadType) {
  type @0 :Text;
  payload @1: PayloadType;
}
struct PingPayload {
  num @0 :Int64;
}

创建有效负载

payload = self.capnp_models['ping_payload'].PingPayload.new_message()
payload.num = 999

req = self.capnp_models['request'].Request.new_message()
req.type = 'ping'
req.payload = payload

读取有效载荷

request = self.capnp_models['request'].Request.from_bytes(req)
payload = request.payload.as_struct(self.capnp_models['ping_payload'].PingPayload)
print(str(payload.num)) # Prints 999
于 2020-05-16T22:30:36.320 回答