代码之家  ›  专栏  ›  技术社区  ›  user3534080

对于使用type()构造的类型,mypy“作为类型无效”

  •  3
  • user3534080  · 技术社区  · 6 年前

    mypy抱怨道 error: Variable "packagename.Foo" is not valid as a type

    Foo = type('Foo', (), {})
    Bar = Optional[Foo]
    

    class Foo:
        pass
    
    Bar = Optional[Foo]
    

    还有别的办法吗?我需要保持类型定义的动态性。

    0 回复  |  直到 4 年前
        1
  •  1
  •   Alex Waygood MacFreek    4 年前

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

    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静态定义来保持MyPy的快乐,但在运行时,我们可以随心所欲地动态。

    不过,您应该知道,这在很大程度上是一种变通方法,而不是解决方案。通过这种方式,我们实际上是在向类型检查器谎报 Foo . 这意味着MyPy可能无法在某些地方发现错误,并且可能在其他地方不存在错误的情况下引发错误。在某些情况下,在运行时动态构造类型非常有用,但这违背了Python中类型检查的一些基本原则,因此您将很难让类型检查器批准您正在进行的操作,而无需进行任何黑客攻击。

        2
  •  -2
  •   Peter Trcka    4 年前

    这对你有用吗?

    from typing import TypeVar, Optional
    
    Foo = TypeVar('Foo')
    Bar = Optional[Foo]
    
    推荐文章