防止平台相关的 python 代码中出现 mypy 错误

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

我有类似于以下一段Python代码的东西:

import platform
if platform.system() == "Windows":
    import winreg
    import win32api

def do_cross_platform_thing() -> None:
    if platform.system() == "Windows":
        # do some overly complicated windows specific thing with winreg and win32api
    else:
        # do something reasonable for everyone else

现在,在 Linux 上,

mypy
抱怨

  • 缺少导入,因为
    win32api
    不存在,
  • “模块没有属性...”因为
    winreg
    模块是 已定义,但基本上已禁用(所有代码都在“is windows”检查后面)。

有没有合理的方法来处理这个问题?我目前的解决方案是

  • 垃圾邮件
    # type: ignore
    到处都是
  • --ignore-missing-imports

有没有更好的解决方案?

python windows cross-platform mypy
2个回答
3
投票

好的,在检查了Docs后,@SUTerliakov 如此善意地建议, 看来我必须改变我的

if platform.system() == "Windows"

对此,语义相同的检查:

if sys.platform == "win32"

只有第二个版本会触发一些神奇的内置 mypy 特殊情况 将此识别为平台检查并忽略分支 not 适用于其平台。


0
投票

您可以使用

# type: ignore[some-mypy-code,unused-ignore]

语法在 Mypy 1.4 中引入(2023 年 6 月 20 日发布,PR 15164)。将

some-mypy-code
替换为从 mypy 获得的错误代码。取自 PR 的示例:

try:
    import graphlib  # type: ignore[import,unused-ignore]
except ImportError:
    pass

在上面,

ignore[import]
忽略导入错误(例如在Python 3.7上,其中graphlib不存在)并且
ignore[unused-ignore]
忽略由
warn_unused_ignores
mypy设置引起的错误,例如Python 3.9 中提供此模块。

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