如何获取函数签名对应的TypedDict?

l0b*_*0b0 9 python typing python-3.x

假设我有一个像这样的函数签名:

def any_foo(
    bar: Bar,
    with_baz: Optional[Baz] = None,
    with_datetime: Optional[datetime] = None,
    effective: Optional[bool] = False,
) -> Foo
Run Code Online (Sandbox Code Playgroud)

我当然可以复制它的声明并对其进行足够的修改以创建以下内容TypedDict

AnyFooParameters = TypedDict(
    "AnyFooParameters",
    {
        bar: Bar,
        with_baz: Optional[Baz],
        with_datetime: Optional[datetime],
        effective: Optional[bool]
    }
)
Run Code Online (Sandbox Code Playgroud)

但这似乎是一个非常简单的转换,我想知道是否有一些简单的方法可以直接从函数创建这个TypedDict(或至少是对)。name: type

C.K*_*.K. 2

结果any_foo.__annotations__正是你想要的。例如:

from typing import Optional
def any_foo(
    req_int: int,
    opt_float: Optional[float] = None,
    opt_str: Optional[str] = None,
    opt_bool: Optional[bool] = False,
) -> int:
    pass
Run Code Online (Sandbox Code Playgroud)

通过any_foo.__annotations__,您可以得到:

{'req_int': int,
 'opt_float': typing.Optional[float],
 'opt_str': typing.Optional[str],
 'opt_bool': typing.Optional[bool],
 'return': int}
Run Code Online (Sandbox Code Playgroud)

请注意,您可以通过键访问返回值的类型return

顺便说一句,由于return是保留关键字,因此您无法命名参数,return因此无需担心重复键:)