如何强制强制转换类型的字典以避免分配中的不兼容类型

汤米

我正在尝试在高效功能(试图避免复制)中执行以下(简化示例),而不使用NotRequired(原因如下所示):

Mytd1 = TypedDict("Mytd1", {a: NotRequired[str], x: int})
Mytd_extra = TypedDict("Mytd_extra", {a: str, x: int, z: str})


def foo(y: Mytd1) -> Mytd_extra:
    # users input object should NOT contain z
    y = cast(Mytd_extra, y). # fails - my guess is `a` is the offender
    y["z"] = "hooray"
    if "a" not in y:
        y["a"] = "whatever"
    return y
 

Mypy 抱怨强制转换为“分配中不兼容的类型”,但这是我想要做的。我如何实现这一目标?我认为a是违规者 - 输出类型需要它

不想

# kill Mytd1 
Mytd_extra = TypedDict("Mytd_extra", {x: int, z: NotRequired[str]})

因为这将允许客户通过,{x: 5, z: "asdf"}foo应该禁止 - 他们只允许通过{x: 5}

我认为以下是可行的,但我试图避免它以提高效率,因为这个函数被多次调用:

def foo(y: Mytd1) -> Mytd_extra:
    new_var: Mytd_extra = {k: v for k:v in y.items()}
    new_var["z"] = "ohno"
    return new_var
苏特利亚科夫

您至少有两个完全有效的解决方案(假设 python 3.11 不打扰typingvs typing_extensions,如果需要调整您的导入)。问题是它y是 type Mytd1,所以你不能给Mytd_extra它赋值(转换结果)。

使用另一个变量

from typing import TypedDict, NotRequired, cast

Mytd1 = TypedDict("Mytd1", {'a': NotRequired[str], 'x': int})
Mytd_extra = TypedDict("Mytd_extra", {'a': str, 'x': int, 'z': str})


def foo(orig_y: Mytd1) -> Mytd_extra:
    # users input object should NOT contain z
    y = cast(Mytd_extra, orig_y)
    y["z"] = "hooray"
    if "a" not in y:
        y["a"] = "whatever"
    return y

这是具有此解决方案的游乐场。

允许重新定义(mypy 标志)

保留您的原始代码,但使用--allow-redefinition(或添加allow_redefinition = true到您使用的配置文件)运行:playground

警告: allow_redefinition没有 Super Cow Powers,它的用例仅限于单一场景:当 RHS 中的表达式包含此变量时,分配给预定义变量。它允许以下操作:

y = 'abc'
y = list(y)

但不是这个:

y = 'abc'
y = 1

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何将泛型类型存储在缓存中,以避免检索时未经检查的强制类型转换?

局部变量分配以避免多次强制转换

使用 C++ 类型特征,是否有某种方法可以避免强制转换

如何避免使用广义类型约束进行强制转换?

字典中包含的AnyObject类型的强制转换值

集合中的类型强制转换

如何在函数参数中强制执行类型并避免隐式转换?

如何以声明方式强制类型兼容?

如何在LabVIEW中使用固有类型转换(在不兼容的指针/引用之间)强制断线?

在结构中避免PhantomData强制类型约束

不兼容的指针类型和返回值使整数无强制转换问题

键入DefaultListModel以避免强制转换

从字典中获取整数,不兼容的类型

将变量分配给“标签”类型,或如何在指针之间键入强制类型转换

从C中的类型分配类型时出错类型不兼容

如何在函数调用中强制转换类型?

如何在Go中强制转换为类型别名?

如何在Java中强制转换通用列表类型?

如何防止构造函数在C ++中强制转换参数类型?

如何在目标 c 中强制强制转换和转换数据类型

联盟分配中的类型不兼容

Mypy错误-分配中的类型不兼容

在分配中获取不兼容的类型

分配中不兼容的类型null

如何在子视图控制器中避免强制类型转换视图模型实例-MVVM

强制类型设置器接受兼容类型

在可变参数中强制转换特定类型

链接以在javascript中强制转换类型

与HKT模式匹配-避免强制转换返回类型