如何在 pycapnp 中实例化一个通用的 Cap'n Proto 类型
How to instantiate a generic Cap'n Proto type in pycapnp
我不知道如何在 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
我希望选项通过添加的结构成为类型,但它丢失了所有类型信息,我无法访问放置在 'some' 联合值中的对象的成员。
Cap'n Proto 泛型并非真正设计用于以这种方式工作。它们是为静态类型检查而设计的(考虑到静态类型的语言,即不是 Python)。泛型类型的实例不能在事后 "become typed" -- 该类型必须静态/在构造时已知。
如果未指定类型参数,则假定为 AnyPointer
。我相信这意味着您需要像这样访问 some
:
o.some.as_struct(Something).a
我认为在 Python 中无法构造具有在运行时指定的类型参数的泛型类型。真正使用泛型的唯一方法是当包含类型指定类型参数时,例如:
struct ContainingType {
option @0 :Option(Something);
}
如果您随后构造一个 ContainingType
,然后访问它的 option
字段,您将得到一个 Option
对象,该对象知道 some
的类型是 Something
,不是 AnyPointer
.
我想提供一个例子来说明我是如何做到这一点的:
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
我不知道如何在 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
我希望选项通过添加的结构成为类型,但它丢失了所有类型信息,我无法访问放置在 'some' 联合值中的对象的成员。
Cap'n Proto 泛型并非真正设计用于以这种方式工作。它们是为静态类型检查而设计的(考虑到静态类型的语言,即不是 Python)。泛型类型的实例不能在事后 "become typed" -- 该类型必须静态/在构造时已知。
如果未指定类型参数,则假定为 AnyPointer
。我相信这意味着您需要像这样访问 some
:
o.some.as_struct(Something).a
我认为在 Python 中无法构造具有在运行时指定的类型参数的泛型类型。真正使用泛型的唯一方法是当包含类型指定类型参数时,例如:
struct ContainingType {
option @0 :Option(Something);
}
如果您随后构造一个 ContainingType
,然后访问它的 option
字段,您将得到一个 Option
对象,该对象知道 some
的类型是 Something
,不是 AnyPointer
.
我想提供一个例子来说明我是如何做到这一点的:
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