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

问题描述 投票:0回答:1

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

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

我当然可以复制它的声明并摆弄它足以创建以下

TypedDict

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

但这似乎是一个非常直接的转换,我想知道是否有一些简单的方法可以直接从函数创建这个

TypedDict
(或至少是
name: type
对)。

python python-typing
1个回答
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

使用

any_foo.__annotations__
,你可以得到这个:

{'req_int': int,
 'opt_float': typing.Optional[float],
 'opt_str': typing.Optional[str],
 'opt_bool': typing.Optional[bool],
 'return': int}

注意您可以通过

return
键访问返回值的类型。

顺便说一句,由于

return
是保留关键字,因此您不能将参数命名为
return
,因此无需担心重复键:)

© www.soinside.com 2019 - 2024. All rights reserved.