如何让 IDE (VS Code) 使用 Protobufs (Python) 进行语法高亮显示

问题描述 投票:0回答:1

我正在使用 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()
技巧隐藏了其暴露的对象。]

python ide protocol-buffers
1个回答
0
投票

IIUC 您可以通过将 --pyi_out=. 添加到

protoc
命令来启用
PYI

protoc \
--proto_path=. \
--python_out=. \
--pyi_out=. \
person.proto

注意 目前此功能未扩展到 gRPC,但应该可用于 protobuf 消息等。

© www.soinside.com 2019 - 2024. All rights reserved.