mypy投诉error: Variable "packagename.Foo" is not valid as a type
Foo = type('Foo', (), {})
Bar = Optional[Foo]
字符串
此错误可以通过将类型定义为类来修复:
class Foo:
pass
Bar = Optional[Foo]
型
还有别的办法吗我需要保持类型定义的动态。
mypy投诉error: Variable "packagename.Foo" is not valid as a type
Foo = type('Foo', (), {})
Bar = Optional[Foo]
字符串
此错误可以通过将类型定义为类来修复:
class Foo:
pass
Bar = Optional[Foo]
型
还有别的办法吗我需要保持类型定义的动态。
3条答案
按热度按时间1wnzp6jl1#
这个怎么样,作为一个解决方案?
字符串
typing.TYPE_CHECKING
是一个常量,在编译时总是True
,在运行时总是False
。通过这种方式,我们可以只告诉MyPy静态定义,但在运行时,我们可以像我们喜欢的那样动态。但是,您应该意识到,这只是一种变通方法,而不是解决方案。通过这种方式,我们本质上是在欺骗类型检查器
Foo
的真正定义。这意味着MyPy可能无法发现某些地方的错误,并且可能在其他地方不存在错误的地方引发错误。在运行时动态构造类型在某些情况下非常有用,但它违背了Python中类型检查的一些基本原则,所以如果没有某种黑客,你很难让类型检查器批准你正在做的事情。p3rjfoxz2#
这里有一个相关的mypy issue 8897。在我的情况下给出这个例子:
字符串
我可以通过显式键入赋值的LHS来说服mypy接受
Bla
:型
仅使用
mypy 1.3.0 (compiled: yes)
进行测试。wqsoz72f3#
这对你有用吗?
字符串