gpt4 book ai didi

python - "Unsupported target for indexed assignment"与 mypy,取决于与分配有关的类型提示时刻

转载 作者:行者123 更新时间:2023-12-03 18:20:51 26 4
gpt4 key购买 nike

我正在尝试在我的 python 代码上输入一些内容,但我收到了以下 mypy 错误:“不支持的索引分配目标”

在一个简化的示例中,它相当于以下代码:

from pathlib import Path
from typing import (Literal, Mapping,
Optional, Union)

STRAND = Literal["+", "-"]
PATH = Union[str, Path]
fastq_files: Mapping[STRAND, Optional[PATH]] = { # simultaneous annotation and assignment
"+": None,
"-": None}

reads_dir = Path("/tmp")
fastq_files["+"] = reads_dir.joinpath( # mypy error
"plus.fastq.gz")
fastq_files["-"] = reads_dir.joinpath( # mypy error
"minus.fastq.gz")

更换 None时出现错误与 Path在字典值中。

为什么值应该是 Optional[PATH] 类型不能用 Path 类型的值替换,鉴于 PATHUnion[str, Path] ?
我原以为 PathUnion[str, Path] 兼容, 这又与 Optional[Union[str, Path]] 兼容.

当我在分配之前注释字典而不是在分配时注释它时,为什么错误会消失(见下文)?
from pathlib import Path
from typing import (Literal, Mapping,
Optional, Union)

STRAND = Literal["+", "-"]
PATH = Union[str, Path]
fastq_files: Mapping[STRAND, Optional[PATH]] # annotation before assignment
fastq_files = {
"+": None,
"-": None}

reads_dir = Path("/tmp")
fastq_files["+"] = reads_dir.joinpath( # no mypy error
"plus.fastq.gz")
fastq_files["-"] = reads_dir.joinpath( # no mypy error
"minus.fastq.gz")

上面显示了 None可以替换为 Path在类型为 Optional[Union[str, Path]] 的“插槽”中.

这是否意味着当我在赋值的同时进行注释时,实际类型被“减少”为与赋值兼容的最严格的可能类型? (结果是“插槽”的类型更具限制性)

最佳答案

问题是映射应该是一个只读协议(protocol)——如果你检查 type hints for Mapping ,您可以看到它实际上没有定义 __setitem__方法。

如果您希望能够改变您的映射,则需要使用 Dict 或 MutableMapping。

按照其他答案的建议切换到使用 TypedDict 也可以,因为 TypedDict 被假定为 Dict 的子类型,因此本质上是可变的。

关于python - "Unsupported target for indexed assignment"与 mypy,取决于与分配有关的类型提示时刻,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60456140/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com