尝试导入 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
文件,您将能够在其他地方使用这些类型
我创建了一个简单的 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
文件,您将能够在其他地方使用这些类型