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

Python:如何定义类型注释,使生成的对象具有相同名称的属性和键?

  •  1
  • Diogo  · 技术社区  · 1 年前

    我想为对象添加注释 obj 这样类型检查器(或语言服务器协议)就可以理解它同时具有一些相同名称的属性和键,从而为我提供正确的intelligense。

    例如
    如果 obj.foo 是一个字符串,并且 obj.bar 是一个整数:那么, obj["foo"] 是一个字符串,并且 obj["bar"] 是一个整数。

    当我键入时,我想为这两个属性/键获得适当的intellisense obj. obj["] .

    我使用VS代码,版权所有

    以下是我到目前为止得到的信息:

    (观察: try/except 块是必需的,因为当的基类 TypedDict 不是 TypedDict )

    myobj = ... # this object comes from other context
    
    from typing import Protocol, TypedDict, cast
    
    class MyDict(TypedDict):
        foo: str
        bar: int
    
    class MyProtocol(Protocol):
        foo: str
        bar: int
    
    try:
        class MyClass(MyDict, MyProtocol): ...
        myobj = cast(MyClass, myobj)
    except TypeError:
        pass
    

    enter image description here

    enter image description here

    此的当前用例: streamlit session state

    如果有这个用例的解决方案,我想知道。

    1 回复  |  直到 1 年前
        1
  •  1
  •   InSync Christian C. Salvadó    1 年前

    您可以使用多个 @overload 预计起飞时间 __getitem__ s与 Literal :

    from typing import Any, Literal, overload
    
    class C:
        foo: int
        bar: bytes
        
        @overload
        def __getitem__(self, n: Literal['foo']) -> int: ...
        
        @overload
        def __getitem__(self, n: Literal['bar']) -> bytes: ...
        
        def __getitem__(self, n: str) -> Any: ...
    

    屏幕截图:

    c. foo: int

    c[''] 'bar': index value

    请注意,如果您过载,这将不起作用 __getattr__ 相反