我正在try 创建几个函数,这些函数将返回不同类型的TypeDict的值.它们中的大多数字段将是相同的,所以我想生成在所有情况下都具有相同功能的基本词典.然而,我被正确地输入这句话难住了.

我的 idea 是创建基本类型Parent并从它继承,只添加NotRequired个字段.

from typing_extensions import NotRequired, TypedDict

class Parent(TypedDict):
    parent_field: str


class Child(Parent):
    child_field: NotRequired[bool | None]


def create_parent() -> Parent:
    return {"parent_field": "example"}


child: Child = create_parent()
# Error:
# Expression of type "Parent" cannot be assigned to declared type "Child"
#  "child_field" is missing from "Type[Parent]"

但是,此操作失败,因为缺少字段child_field,即使其类型为NotRequired.它为什么会失败,如何规避这个问题?

编辑:我正在使用Pylance(如此简单)进行打字判断.

mypy(playground)给出类似的错误消息:

赋值中的类型不兼容(表达式的类型为"Parent",变量的类型为"Child")[Assignment]

推荐答案

这个问题在第PEP589节中有明确的解释.让我引述如下:

没有关键字xTypedDict类型A与具有非必需关键字xTypedDict类型不一致,因为在运行时,关键字x可能存在并且具有不兼容的类型(由于 struct 子类型化,这可能在A中不可见).示例:

class A(TypedDict, total=False):
    x: int
    y: int

class B(TypedDict, total=False):
    x: int

class C(TypedDict, total=False):
    x: int
    y: str

 def f(a: A) -> None:
     a['y'] = 1

 def g(b: B) -> None:
     f(b)  # Type check error: 'B' incompatible with 'A'

 c: C = {'x': 0, 'y': 'foo'}
 g(c)
 c['y'] + 'bar'  # Runtime error: int + str

所以,您的Parent类是not可赋值给Child类型的变量,pylance指出了这一点.

Python相关问答推荐

Polars将相同的自定义函数应用于组中的多个列,

python—telegraph—bot send_voice发送空文件

如何在Python中使用Iscolc迭代器实现观察者模式?

如何从比较函数生成ngroup?

如何使用matplotlib查看并列直方图

获取git修订版中每个文件的最后修改时间的最有效方法是什么?

浏览超过10k页获取数据,解析:欧洲搜索服务:从欧盟站点收集机会的微小刮刀&

对数据帧进行分组,并按组间等概率抽样n行

Pandas:根据相邻行之间的差异过滤数据帧

大Pandas 每月重新抽样200万只和300万只

如何使用aiohttp获取图像并直接处理它而不保存它?

有理由将基于Django职业的观点个人化吗?

对齐多个叠置多面Seborn CAT图

收到Firebase推送通知时,电话不会震动

从来自另一个Python脚本的消息中获取FlaskServer中的错误字段

运行时错误:在python3.8中,等待未与future 异步词典理解一起使用

返回最后一行以上的所有行,直到满足Python中的条件

Bash命令计算错误的时间

用Arpeggio解析单行和多行注释

用动态规划法计算斐波那契曲线的命中次数