python - mypy "is not valid as a type"对于使用 `type()` 构造的类型

标签 python python-3.x type-hinting mypy python-typing

mypy 提示 error: Variable "packagename.Foo" is not valid as a type

Foo = type('Foo', (), {})
Bar = Optional[Foo]
可以通过将类型定义为类来修复此错误:
class Foo:
    pass

Bar = Optional[Foo]
有没有其他办法解决这个问题?我需要保持类型定义动态。

最佳答案

作为一种解决方法,这个怎么样?

from typing import Optional, TYPE_CHECKING

if TYPE_CHECKING:
    class Foo: pass
else:
    Foo = type('Foo', (), {})
    
Bar = Optional[Foo]
typing.TYPE_CHECKING是一个常数,永远是 True在编译时,并且总是 False在运行时。通过这种方式,我们可以通过只告诉 MyPy 静态定义来让它开心,但在运行时我们可以随心所欲地动态。
不过,您应该知道,这在很大程度上是一种变通方法,而不是解决方案。通过这样做,我们实际上是在向类型检查员撒谎 Foo 的真实定义。 .这意味着 MyPy 可能无法在某些地方发现错误,并可能在其他地方不存在的地方引发错误。在运行时动态构造类型在某些情况下非常有用,但与 Python 中类型检查的一些基本原则背道而驰,因此如果没有某种黑客攻击,您将很难让类型检查器批准您正在做的事情。

关于python - mypy "is not valid as a type"对于使用 `type()` 构造的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58594682/

相关文章:

Python按模式拆分字符串

python - 写入文件的精确位置

PHP类型提示原始值?

python - Callable 是无效的基类?

python - 类不能使用 mypy 子类化 'QObject'(类型为 'Any')

python - 在 django 和 unicode 中使用 python 登录时出现问题

python - Django 错误中关于 Page 的顶级信息

python - 在对象列表中创建一个 float

python-3.x - 多参数 url 模式 django 2.0

python - 如何访问用 Python 编写的 FORTRAN 函数?