mypy 出现意外错误:为什么我的类型不可接受?

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

我从 mypy 收到一个我无法解释的错误(因此无法修复):

build_rag.py:116: error: 
Argument "metadatas" to "add" of "AsyncCollection" 
has incompatible type "list[dict[str, str]]"; 
expected "Mapping[str, str | int | float | bool] | 
list[Mapping[str, str | int | float | bool]] | 
None"  [arg-type]

我正在通过 mypy 正确检测到的

list[dict[str,str]]
。我本希望这与三种预期类型中的第二种相匹配:
list[Mapping[str, str|int|float|bool]]
。我不是被调用的
add()
函数的作者。 (这是
chromadb.AsyncCollection.add()
方法。)

我是愚蠢/盲目,还是我的朋友应该接受我的输入?

调用该函数的代码是这样的,其中 ids 和 chunks 已在前面定义。

code
变量已经是一个字符串;对 str() 的调用只是我的绝望之举。
path
变量是一个
pathlib.Path
对象。
chunks
list[str]

            metadata = {
                "dc.identifier": str(path),
                "code": str(code),
            }
            metadatas = [metadata for chunk in chunks]
            await collection.add(
                ids=ids,
                documents=chunks,
                metadatas=metadatas,
            )

这是我的文件中标记的唯一 mypy 错误,因此,祈祷吧,其余类型如广告所示。

python mypy chromadb
1个回答
0
投票

metadatas
预计为
list[Mapping[str, str | int | float | bool]]
类型。

要解决此问题,您可以将

metadatas
转换为
list[Mapping[str, str]]
,或者从一开始就确保
metadata_list
List[Dict[str, str]]

# Ensure metadata is correctly typed right from its creation
metadata_list: List[Dict[str, str]] = [
    {"dc.identifier": str(path), "code": str(code)}
    for chunk in chunks
]

# Asynchronous method call without the need for casting
await collection.add(
    ids=ids,
    documents=chunks,
    metadatas=metadata_list,
)
© www.soinside.com 2019 - 2024. All rights reserved.