gpt4 book ai didi

python - 如何列出您在谷歌 Protocol Buffer 中定义的属性?

转载 作者:太空宇宙 更新时间:2023-11-03 13:16:55 26 4
gpt4 key购买 nike

我有一个类似于下图的 google Protocol Buffer 定义:

message Foo {
required string Name = 1;
optional string Address = 2;
optional string NickName = 3;
optional int32 height = 4;
}

现在在 python 中,我想列出上面的所有属性,但只列出那些属性。但是,交互式 python,我看到谷歌定义了更多的字段。所以这似乎有问题。

我看过一些关于自省(introspection)的 stackoverflow 帖子。有一个看起来不错的检查模块,但问题是 google protocol buffers 为我定义的其他成员。

有办法吗?

这是我想做的。我有一个 python 实用程序,可以从命令行填写上述字段。我使用 argparse,我会:

parser = argparse.ArgumentParser(...)
parser.add_argument( "--attribute_name", blah)

我想将 add_argument() 放在一个循环中,并根据原型(prototype)文件定义使其动态化。基本上,我不想每次更改原型(prototype)文件时都继续修改实用程序的代码。看来我应该能够在 python 中做到这一点。我只是不知道如何。

有人有什么建议吗?

谢谢。

有关其他信息,我采用了上面的示例,并使用 protoc 对其进行了编译。这是交互式输出:

>>> import hello_pb2
>>> h = hello_pb2.Foo()
>>> dir(h)
['ADDRESS_FIELD_NUMBER', 'Address', 'ByteSize', 'Clear', 'ClearExtension', 'ClearField', 'CopyFrom', 'DESCRIPTOR', 'FindInitializationErrors', 'FromString', 'HEIGHT_FIELD_NUMBER', 'HasExtension', 'HasField', 'IsInitialized', 'ListFields', 'MergeFrom', 'MergeFromString', 'NAME_FIELD_NUMBER', 'NICKNAME_FIELD_NUMBER', 'Name', 'NickName', 'ParseFromString', 'RegisterExtension', 'SerializePartialToString', 'SerializeToString', 'SetInParent', '_InternalParse', '_InternalSerialize', '_Modified', '_SetListener', '__class__', '__deepcopy__', '__delattr__', '__doc__', '__eq__', '__format__', '__getattribute__', '__hash__', '__init__', '__metaclass__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__slots__', '__str__', '__subclasshook__', '__unicode__', '__weakref__', '_cached_byte_size', '_cached_byte_size_dirty', '_decoders_by_tag', '_extensions_by_name', '_extensions_by_number', '_fields', '_is_present_in_parent', '_listener', '_listener_for_children', 'height']

我检查了一些有前途的字段,如 _fields,但那是空的。

这是答案:(由 Kenton Varda 的回复给出)

import hello_pb2
h = hello_pb2.Foo()
f = hello_pb2.Foo()
f.DESCRIPTOR.fields_by_name.keys()

最佳答案

您想遍历 Foo.DESCRIPTOR.fields。查看 Descriptor 类:

https://developers.google.com/protocol-buffers/docs/reference/python/google.protobuf.descriptor.Descriptor-class

每个消息类都有一个静态成员DESCRIPTOR,它是该类型的描述符。

关于python - 如何列出您在谷歌 Protocol Buffer 中定义的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26741407/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com