我从 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 错误,因此,祈祷吧,其余类型如广告所示。
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,
)