尝试导入 Protobuf 模块时,mypy 出现模块没有属性“_USE_C_DESCRIPTORS”错误

Module has no attribute "_USE_C_DESCRIPTORS" error by mypy when trying to import a Protobuf module

我创建了一个简单的 Protobuf 对象(我们称之为 file_nam.proto),如下所示:

syntax = "proto3";

package something.somethingelse;

message SomeName {
  string first = 1;
  string second = 2;
  string third = 3;
  string forth = 4;
  uint64 fifth = 5;
  uint64 sixth = 6;
}

然后我使用 protobuf 包成功编译成 .py 文件。问题是,当我尝试在另一个模块中导入 .py 模块时,mypy returns 当我 运行 pre-commit 命令时出现以下错误。

interfaces/proto/file_name_pb2.py:28: error: Module has no attribute "_USE_C_DESCRIPTORS"

错误指的是

中的最后一行
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler.  DO NOT EDIT!
# source: rasv2_task.proto
"""Generated protocol buffer code."""
from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import message as _message
from google.protobuf import reflection as _reflection
from google.protobuf import symbol_database as _symbol_database
.
.
.

if _descriptor._USE_C_DESCRIPTORS == False:
    .
    .
    .

但这没有任何意义,因为 _descriptor 实际上具有 _USE_C_DESCRIPTORS 属性。

mypy 不理解从 protobuf 生成的代码——它做了一些 meta-programmery 混淆类型检查器的事情

但幸运的是有一个项目可以生成 mypy 可以理解的 .pyi 存根 -- https://github.com/nipunn1313/mypy-protobuf

mypy 将更喜欢 .pyi 文件而不是真正的 .py 文件,您将能够在其他地方使用这些类型