使用mypy做Python静态类型检查时遇报错:Name 'google' is not defined
解决mypy报错“Name 'google' is not defined”的问题
我之前在项目里用mypy检查protobuf相关代码时,也碰到过一模一样的错误。核心问题是mypy没办法识别你在类型注解里直接写的google.protobuf.timestamp_pb2.Timestamp,因为它找不到google这个命名空间的定义。下面给你几个实用的解决办法:
显式导入对应的类型模块
最直接的方式是在文件顶部把需要的类型导入进来,这样mypy就能找到它了。比如:from google.protobuf.timestamp_pb2 import Timestamp然后把你的类型注解改成更简洁的形式:
# type: () -> Timestamp如果你坚持要用完整的路径名,那至少得导入
google或者google.protobuf命名空间,比如:import google.protobuf.timestamp_pb2不过还是推荐第一种直接导入类的方式,代码更清晰,也能避免这类命名空间问题。
安装protobuf的类型 stubs
有时候即使你已经装了protobuf库,mypy可能还是拿不到它的类型定义。这时候需要安装官方维护的类型 stubs包,运行下面的命令就行:pip install types-protobuf安装完成后,mypy就能正确识别所有protobuf相关的类型了。
检查mypy的配置文件
最后可以检查一下你的mypy.ini或者pyproject.toml配置,看看有没有把google相关的模块排除在检查范围之外。如果有类似exclude = ["google/*"]的配置,得把它去掉,让mypy能扫描到这些模块的类型信息。
内容的提问来源于stack exchange,提问作者rajan sthapit
相关产品推荐
相关产品推荐

