我不知道如何在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
我希望可以通过添加的结构来键入选项,但是该选项会丢失所有类型信息,并且我无法访问放置在“某些”联合值中的对象的成员。
答案 0 :(得分:0)
Cap'n Proto泛型并不是真的可以那样工作。它们专为静态类型检查而设计(请牢记静态类型的语言,即非Python)。事实之后,不能“成为类型化”泛型类型的实例-必须在构造时静态地知道该类型。
如果未指定类型参数,则假定为AnyPointer
。我相信这意味着您需要像这样访问some
:
o.some.as_struct(Something).a
我认为在Python中无法用运行时指定的type参数构造泛型。真正使用泛型的唯一方法是在包含类型指定类型参数时,例如:
struct ContainingType {
option @0 :Option(Something);
}
如果您随后构造一个ContainingType
并访问其option
字段,则会得到一个Option
对象,该对象知道some
的类型为{{1 }},而不是Something
。
答案 1 :(得分: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