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

Python 用于获取与静态类型检查器一起使用的TypedAct值类型的函数,python,dictionary,mypy,python-typing,Python,Dictionary,Mypy,Python Typing,我希望制作一个Python(3.8+)函数,它是: 输入:aTypedDict的键 输出: 返回值(简单) 适当地暗示了类型(我被卡住的地方) 下面是一个代码示例,有助于解释: 从键入import Any、Literal、TypedDict Foo类(类型Ddict): 酒吧:int baz:str 垃圾邮件:有吗 foo=foo(bar=0,baz=“hi”,spam=1.0) def get_type(key:Literal[“bar”,“baz”]):#如何在此处键入提示返回?

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

  • 输入:a
    TypedDict的键
  • 输出:
    • 返回值(简单)
    • 适当地暗示了类型(我被卡住的地方)
下面是一个代码示例,有助于解释:

从键入import Any、Literal、TypedDict
Foo类(类型Ddict):
酒吧:int
baz:str
垃圾邮件:有吗
foo=foo(bar=0,baz=“hi”,spam=1.0)
def get_type(key:Literal[“bar”,“baz”]):#如何在此处键入提示返回?
“”“传递键时获取TypedAct值的函数。”“”
val=foo[key]
#这是通过智能索引实现的
#见:https://mypy.readthedocs.io/en/stable/literal_types.html#intelligent-索引
显示类型(val)#mypy:显示类型为“Union[builtins.int,builtins.str]”
返回值
获取类型=获取类型(“条形”)
显示类型(获取类型)#mypy:显示类型为“任意”
#我希望这个有输出:“int”
如果您不知道,我使用的静态类型检查器是
mypy

我上面的函数
get\u type
已经完成了一半,但我不确定如何键入提示返回
get\u type

对于返回
get\u type
,我应该输入什么类型的提示


研究

这两个问题


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

如果我正确理解了您的问题,您可以使用
@overload
进行
get\u 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'


非常感谢@alex_noname,这很有效!在我的实际用例中,有很多键。使用此解决方案,
get\u type
方法具有相当多的
重载
s,并且不会有“轻量级”的感觉。我会坚持在给出答案之前,以防有一种不那么冗长的方法来解决这个问题。