用于获取与静态类型检查器一起工作的TypedDict值的类型的函数



我正在寻找一个Python(3.8+(函数,它是:

  • 输入:TypedDict的键
  • 输出:
    • 返回值(easy(
    • 是否适当地键入提示(我被卡住的地方(

这里有一个代码示例来帮助解释:

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_type上面的函数已经达到了智能索引的一半,但我不知道如何键入提示get_type的返回。

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


研究

这两个问题

  • mypy的工厂函数`TypedDict`
  • 如何从泛型静态获取TypeVar参数以用于静态类型检查

使用TypeVar提供答案。有没有办法将TypeVarTypedDict结合使用?

如果我正确理解您的问题,您可以将@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'

相关内容

  • 没有找到相关文章

最新更新