繁体   English   中英

protobuf 包是如何使用的?

[英]How are protobuf packages used?

我不明白谷歌 Python protobuf 文档中关于软件包的最后一句的第一部分:

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

实际上,“您在.proto文件中定义的包对生成的代码没有影响”在 Python 中(并且可能因此在确实使用命名空间的语言中)实际上是错误的,因为生成的..._pb2.py文件包含的描述符具有一个包字段。

DESCRIPTOR = _descriptor.FileDescriptor(
  name='example.proto',
  package='example',
  syntax='proto3',
   ...
)

我已经检查过,在生成代码后,您无法import example到常规的 python 文件中。 即声明package example; 在你的.proto文件,然后protoc编译它并不会自动适用于您的环境中Python文件导入你的包(你仍然必须使用import ..._pb2访问类)。

有没有人能够解释在.proto文件中声明的包是如何在 Python 中使用的,并说 C# 作为一种明确使用命名空间的语言的例子?

引用文档本身:

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

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

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

  2. 为了便携性 包指令在 Python 和 Golang 中都被忽略。 但是像 C++ 和 C# 这样显式创建命名空间的语言会考虑指定的包。 因此,对于Foo在上面的例子中,一个名为消息类型Foo将在命名空间中声明这两个barbaz 您使用 Python 应用程序创建的 proto 文件可以以几乎相同的方式为您的 C# 应用程序编译。 需要注意的是,Protobuf 是用于序列化和反序列化数据的语言不可知机制。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM