【发布时间】:2020-02-23 22:34:46
【问题描述】:
mypy 抱怨error: Variable "packagename.Foo" is not valid as a type
Foo = type('Foo', (), {})
Bar = Optional[Foo]
可以通过将类型定义为类来修复此错误:
class Foo:
pass
Bar = Optional[Foo]
还有其他方法可以解决这个问题吗?我需要保持类型定义动态。
【问题讨论】:
-
为什么要这样使用
type()?请注意,mypy不会运行/评估代码,所以我认为不会执行type来“创建新类型对象” -
我猜这是因为 mypy can't handle dynamic base classes.
-
一般来说,静态类型检查器无法处理动态创建的类型。
-
我不太明白的是,如果你“承诺”类型检查器你的变量将是类类型
a: Type[Foo] = Foo,为什么它不认为是有效的class Bar(a)?我们可以在 TypeScript 中毫无问题地做到这一点:typescriptlang.org/play/#code/… -
我打算建议不同之处在于
class,作为一个句法结构,必须产生一个类型,而type可以反弹到任何可调用的运行。但是,也可以通过指定不同的元类来修改class语句。最后,请记住,mypy确实是一个 hack(从最好的意义上说)试图从 Python 所基于的固有动态数据模型中挤出尽可能多的静态类型。它必须解决许多极端情况。
标签: python python-3.x type-hinting mypy python-typing