[英]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 模块是根据它们在文件系统中的位置组织的。
那么包声明到底有什么用呢? 我相信两件事:
避免消息对象中命名冲突的可能性。 如果假设您有一条消息在同一应用程序下被不同地声明,那么您可以考虑在 proto 文件的开头提供包说明符,然后使用在定义其他消息类型的字段时指定的包。 例如,如果在package bar
和package baz
都定义了Foo
; 然后在需要的地方使用bar.Foo
和baz.Foo
。
为了便携性。 包指令在 Python 和 Golang 中都被忽略。 但是像 C++ 和 C# 这样显式创建命名空间的语言会考虑指定的包。 因此,对于Foo
在上面的例子中,一个名为消息类型Foo
将在命名空间中声明这两个bar
和baz
。 您使用 Python 应用程序创建的 proto 文件可以以几乎相同的方式为您的 C# 应用程序编译。 需要注意的是,Protobuf 是用于序列化和反序列化数据的语言不可知机制。
话虽如此,我个人并没有发现在我的 Python 应用程序的 protobuf 消息中使用包说明符。
参考: https : //developers.google.com/protocol-buffers/docs/proto
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.