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

别名类型上的Python实例

  •  0
  • Jorayen  · 技术社区  · 2 年前

    我定义了以下类型和类型别名:

    @unique
    class MyEnum(Enum):
        A = 1
        B = 2
        C = 3
        D = 4
    
    class A:
        pass
    
    
    class B:
        pass
    
    MyAlias = MyEnum | A | B
    
    MyAlias2 = MyAlias | str | int
    
    @dataclass(slots=True)
    class A:
        type: MyAlias2
    

    如果我这样做 isinstance 检查如下:

    a = A()
    isintance(a, MyAlias)
    

    它返回 False .

    我知道发生这种情况是因为我稍后重新定义了类,但我这样做是因为我首先需要定义什么是类型 MyAlias 所以我以后可以定义什么是 MyAlias2 然后能够将其用作类内的属性 A 。很明显,由于我们在python中,我无法定义类的属性 A. 并制作一个接受任何内容的构造函数,但由于我正在考虑未来的可移植性,而且我现在确实想要类型提示的“好处”,所以我这样做,我想知道我能做些什么来制作 意见 汇报 True 在这种情况下,首先定义的内容之间存在循环依赖关系。

    2 回复  |  直到 2 年前
        1
  •  2
  •   Unmitigated    2 年前

    您可以定义 A 首先使用字符串作为typehint。

    @dataclass(slots=True)
    class A:
        type: 'MyAlias'
    
    MyAlias = MyEnum | A | B
    
        2
  •  1
  •   Arunbh Yashaswi    2 年前
    MyAlias = Union[MyEnum, A, B]
    MyAlias2 = Union[MyAlias, str, int]
    
    a = A()
    isinstance_a = isinstance(a, A)# returns True
    isinstance_union = isinstance(a, (MyEnum, A, B))#returns True
    

    例如,这里允许进行1乘1的检查,而不是根据类型的组合进行检查