如何解决如何获得与函数签名相对应的TypedDict?
说我有一个这样的函数签名:
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
对)。
解决方法
我不知道这是否仍然有用,但可能对谁有帮助,这是一种无需定义__annotations__
即可通过定义方法的参数和类型来实现方法类型检查的优雅方法。 [1] 。
我们可以利用typing
s NamedTuple
创建一个保存参数的对象:
class FooContext(NamedTuple):
bar: Bar
with_baz: Optional[Baz] = None
with_datetime: Optional[date] = None
effective: Optional[bool] = False
现在,我们定义any_foo
函数以将其接受为参数:
def any_foo(foo_context : FooContext) -> Foo:
pass
整个代码为:
from datetime import date
from typing import Optional,NamedTuple
class Foo:
pass
class Bar:
pass
class Baz:
pass
class FooContext(NamedTuple):
bar: Bar
with_baz: Optional[Baz] = None
with_datetime: Optional[date] = None
effective: Optional[bool] = False
def any_foo(foo_context : FooContext) -> Foo:
pass
bar_1 = Bar()
foo_context = FooContext(bar_1)
运行mypy将产生:
Success: no issues found in 1 source file
但是,如果我们将bar_1
更改为非Bar
,mypy将抱怨:
foo.py:24: error: Argument 1 to "FooContext" has incompatible type "int"; expected "Bar"
Found 1 error in 1 file (checked 1 source file)
[1]因为如果基于另一个定义TypedDict
或函数签名,则需要知道另一个__annotations__
(在检查时未知),并进行定义在运行时强制转换类型的装饰器错过了类型检查的要点。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。