用于获取与静态类型检查器一起使用的TypedAct值类型的函数

2024-06-01 02:25:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望制作一个Python(3.8+)函数,它是:

  • 输入:aTypedDict的键
  • 输出:
    • 返回值(简单)
    • 适当地暗示了类型(我被卡住的地方)

下面是一个代码示例,有助于解释:

from typing import Any, Literal, TypedDict

class Foo(TypedDict):
    bar: int
    baz: str
    spam: Any

foo = Foo(bar=0, baz="hi", spam=1.0)

def get_type(key: Literal["bar", "baz"]):  # How to type hint the return here?
    """Function that get TypedDict's value when passed a key."""
    val = foo[key]
    # This works via intelligent indexing
    # SEE: https://mypy.readthedocs.io/en/stable/literal_types.html#intelligent-indexing
    reveal_type(val)  # mypy: Revealed type is 'Union[builtins.int, builtins.str]'
    return val

fetched_type = get_type("bar")
reveal_type(fetched_type)  # mypy: Revealed type is 'Any'
# I would like this to have output: 'int'

如果您不知道,我使用的静态类型检查器是mypy

我上面的函数get_typeintelligent indexing一起完成了一半,但我不确定如何键入提示返回get_type

我应该为get_type的返回设置什么类型的提示


研究

这两个问题

使用TypeVar提供答案。是否有某种方法可以将TypeVarTypedDict一起使用


Tags: tokey类型gettypebaranyval
1条回答
网友
1楼 · 发布于 2024-06-01 02:25:47

如果我正确理解了您的问题,您可以使用@overload表示get_type

from typing import Any, Literal, TypedDict, Union, overload

class Foo(TypedDict):
    bar: int
    baz: str
    spam: Any

foo = Foo(bar=0, baz="hi", spam=1.0)


@overload
def get_type(key: Literal["bar"]) -> int: ...

@overload
def get_type(key: Literal["baz"]) -> str: ...
    

def get_type(key: Literal["bar", "baz"]) -> Union[int, str]:
    """Function that get TypedDict's value when passed a key."""
    val = foo[key]
    reveal_type(val)  # mypy: Revealed type is 'Union[builtins.int, builtins.str]'
    return val

fetched_type = get_type("bar")
reveal_type(fetched_type)  # mypy: Revealed type is 'builtins.int'

相关问题 更多 >