Protobuf如何生成MetricDescriptor方法?能否实现代码自动补全?
关于GCP监控API Protobuf生成代码与类型提示的问题解答
1. 为什么MetricDescriptor()可调用但未在metric_pb2.py中显式定义?
Protobuf的Python代码生成靠元类机制实现动态类创建,具体逻辑如下:
- 你在
metric_pb2.py里找不到MetricDescriptor的显式构造方法,但能找到类似MetricDescriptor = _message.Message._meta_init(_DESCRIPTOR, 'MetricDescriptor', __name__)的代码(不同Protobuf版本写法略有差异)。 - 这行代码是通过
google.protobuf.message.MessageMeta元类,根据proto定义转换来的DESCRIPTOR描述符,动态生成了MetricDescriptor类。 - 该类的构造逻辑继承自
google.protobuf.message.Message的__init__方法,所以你能直接调用MetricDescriptor()实例化对象,不需要显式写构造方法。
2. Pylint无法识别生成的pyi文件、protoc需借助grpc_tools的问题
Pylint不识别pyi文件的解决方向
- Pylint默认不会自动扫描所有路径下的pyi文件,你可以在项目根目录的
.pylintrc中配置:
或者添加[MASTER] init-hook='import sys; sys.path.append("你的pyi文件所在目录路径")'--extension-pkg-whitelist=google.protobuf参数,让Pylint加载Protobuf相关的类型提示。 - 确保Pylint版本在2.14.0以上,旧版本对Protobuf生成的pyi文件支持不完善。
为什么需要用grpc_tools运行protoc?
- 单独的protoc没有内置生成Python类型提示(pyi)的插件,而
grpc_tools.protoc是Google封装的工具,打包了生成Python代码和pyi文件所需的全部插件(包括protoc-gen-python和protoc-gen-python-grpc)。 - 直接用protoc生成pyi需要手动指定插件路径和输出参数,步骤繁琐;用grpc_tools可以省去配置插件的麻烦,直接生成符合要求的代码和类型提示文件。
内容的提问来源于stack exchange,提问作者red888
相关产品推荐
相关产品推荐

