protobuf软件包如何使用?

JSS*_*all 7 c# package protocol-buffers python-3.x

我不了解来自Google的Python protobuf文档的软件包的最后一句话的第一部分:

.proto文件以程序包声明开头,这有助于防止不同项目之间的命名冲突。在Python中,包通常由目录结构决定,因此您在.proto文件中定义的包对生成的代码不起作用。但是,您仍然应该声明一个以避免在协议缓冲区名称空间以及非Python语言中的名称冲突

实际上是错误的,因为.proto文件中定义的包将不会对生成的代码产生影响(在Python中(因此可能是在使用命名空间的语言中)),因为生成的..._pb2.py文件包含具有包字段的描述符。

DESCRIPTOR = _descriptor.FileDescriptor(
  name='example.proto',
  package='example',
  syntax='proto3',
   ...
)
Run Code Online (Sandbox Code Playgroud)

我已经检查过import example了,生成代码后就无法进入常规的python文件。即声明package example;您的.proto文件然后进行protoc编译不会自动使您的包可用于您环境中的python文件中的导入(您仍必须使用import ..._pb2来访问这些类)。

有谁能够解释在.proto文件中声明的包如何在Python中使用,并说出C#作为显式使用名称空间的语言的示例?

Arc*_*oor 2

引用文档本身:

在 Python 中,package 指令被忽略,因为 Python 模块是根据其在文件系统中的位置进行组织的。

那么包声明到底有什么用呢?我相信两件事:

  1. 避免消息对象中命名冲突的可能性。如果假设您有一条在同一应用程序下以不同方式声明的消息,那么您可以考虑在 proto 文件的开头提供包说明符,然后在定义其他消息类型的字段时使用指定的包。例如,ifFoo是在package barand package bazBoth 下定义的;然后在需要的地方bar.Foo使用baz.Foo

  2. 为了便携性。Python 和 Golang 中都会忽略 Package 指令。但是像 C++ 和 C# 这样显式创建命名空间的语言,确实会考虑指定的包。因此,在上面的示例中,将在和的命名空间中声明Foo名为 的消息类型。使用 Python 应用程序创建的 proto 文件可以以大致相同的方式为 C# 应用程序进行编译。值得注意的是,Protobuf 是与语言无关的数据序列化和反序列化机制。Foobarbaz

话虽如此,我个人并没有在我的 Python 应用程序的 protobuf 消息中发现包说明符的使用。

参考: https: //developers.google.com/protocol-buffers/docs/proto