【问题标题】:What is the purpose of "if False:" here?这里“if False:”的目的是什么?
【发布时间】:2020-04-24 04:07:04
【问题描述】:

https://github.com/asottile/pyupgrade/blob/fecacc91e57c224a0bd2564579ef01238650126c/pyupgrade.py#L53

if False:  # pragma: no cover (mypy)
    from typing import Type
    if sys.version_info >= (3,):
        AsyncFunctionDef = ast.AsyncFunctionDef
    else:
        AsyncFunctionDef = ast.stmt

提交没有透露: https://github.com/asottile/pyupgrade/commit/fecacc91e57c224a0bd2564579ef01238650126c#diff-8213eba6a28bcc759225cd8cf49b2fd1

False 在 Python 2 中可以是真的(可以重新定义),但在 Python 3 中则不行。这可能是个玩笑,或者正在进行的工作,或者注释掉代码的方式,但这是相当不错的一个成熟的工具——我错过了什么吗?

【问题讨论】:

    标签: python python-3.x boolean type-hinting mypy


    【解决方案1】:

    AsyncFunctionDef 的值在运行时从不需要,只有 mypy 在两个兼容 Python-2 的类型提示中(在第 1298 和 1318 行)。 if False 防止在运行时发生分配,但让mypy 在类型检查期间查看要使用的正确底层类型。 (它还可以防止在尝试在 Python 2 下导入 typing 模块时引发 ImportError。)

    在此处使用typing.TYPE_CHECKING(其值为False 在运行时,但Truemypy 运行时)会更清楚,除了typing.TYPE_CHECKING 不可用在 Python 2 中。

    【讨论】:

    • 谢谢!我对mypy 不是很熟悉,我可以看到他们推荐使用MYPY = False,其中TYPE_CHECKING 不可用mypy.readthedocs.io/en/latest/common_issues.html 所以mypy 认为False 在类型检查时是真实的?
    • MYPY = False 确保当代码实际执行时,您将跳过由if MYPY:... 保护的内容。当mypy 运行时,它解释 某些条件而不实际评估 Python 代码。名称 MYPY 是特殊情况下假定 True,无论其实际值如何。
    • 对不起,你是说MYPY变量对mypy有特殊意义吗?如果是,为什么要检查if False: 类型?或者你是说mypy 类型检查每一行,不管它是否在运行时执行
    • 是的,mypy 类型检查所有代码;它不对运行时语义做出任何假设,例如“此条件是否为真”,正是因为它需要遵循在运行时可能会或可能不会达到的导入。
    【解决方案2】:

    if Falseif typing.TYPE_CHECKING 使用,因为python3.5.0-3.5.2 被pyupgrade 支持并且没有typing.TYPE_CHECKING -- 你可以在flake8-typing-imports 找到更多信息(我也是作者这个 flake8 插件)

    在 3.5.3+ 和 typing 后向端口(适用于任何 TYPE_CHECKING 可用

    免责声明:我是pyupgrade的作者

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-05
      • 2020-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-02
      • 2017-03-16
      相关资源
      最近更新 更多