我正在使用 VS Code,但我怀疑所有 IDE 都存在以下问题。
将 protobuf 文件 (
.proto
) 编译为 Python (_pb2.py
) 时,消息将作为类提供,但 Google 公开类的机制很难让 IDE 发现。
例如,以下玩具示例
person.proto
syntax = "proto3";
message Person {
string name = 1;
string address = 2;
int32 age = 3;
}
如果我跑步
> protoc -I=. --python_out=. person.proto
它将生成一个
person_pb2.py
文件,该文件将有一个 Person
类,我可以从中创建一个对象,看起来像这样:
from person_pb2 import Person
me = Person(name="me", address="heaven", age=2)
但是
from person_pb2 import Person
行将突出显示为错误。
具体来说,在安装了 Pylance 的 VS Code 中,它会说
“Person”是未知的导入符号 [Pylance (reportAttributeAccessIssue)]
(导入)人物:未知
原因很清楚:如果我查看
person_pb2.py
文件 没有顶级对象 Person
导出!对于任何深度的任何 protobuf 消息都是如此。它们都被分解成复杂的对象,然后通过填充到运行时
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'person_pb2', globals())
对于填充环境来说,这是一个非常奇怪的边缘情况,我真的不希望 IDE 发现它。
那么,我可以做什么 - 或者大多数人做什么 - 让 IDE 正确识别 protobuf?
目前,我只是用
# type: ignore
注释乱扔所有代码,这并不理想,因为我只是通过关闭该工具来“解决”问题。还有更好的选择吗
[需要明确的是,我目前通过执行诸如
from person_pb2 import Person # type: ignore
之类的操作来“解决”这个问题,以关闭 Pylance 的投诉。但我实际上喜欢 Pylance 的建议...问题是 Google 通过这个奇怪的 globals()
技巧隐藏了其暴露的对象。]
IIUC 您可以通过将 --pyi_out=.
添加到
protoc
命令来启用 PYI:
protoc \
--proto_path=. \
--python_out=. \
--pyi_out=. \
person.proto
注意 目前此功能未扩展到 gRPC,但应该可用于 protobuf 消息等。