Model serialization drops keys
還沒有人認領這個 Issue。
評估
研究方向
從 src/glean/api_client/models/documentcontent.py 開始,檢查 serialize_model,然後透過 unmarshal_json_response 使用 documents.json 執行 debug.py。當序列化後的 DocumentContent content 非空且包含受影響的欄位時即表示完成,這一點由 debug.py 中的 assertions 檢查。
由索引模型根據 Issue 內容生成。
描述
There may be an issue affecting the serialize_model methods of the Pydantic models in this library.
Taking the DocumentContent model as an example, we see:
class DocumentContent(BaseModel):
full_text_list: Annotated[
Optional[List[str]], pydantic.Field(alias="fullTextList")
] = None
r"""The plaintext content of the document."""
@model_serializer(mode="wrap")
def serialize_model(self, handler):
optional_fields = set(["fullTextList"])
serialized = handler(self)
m = {}
for n, f in type(self).model_fields.items():
k = f.alias or n
val = serialized.get(k)
if val != UNSET_SENTINEL:
if val is not None or k not in optional_fields:
m[k] = val
return m
This model uses a field alias that, when constructing the Pydantic object from an API response, will map the fullTextList field of the JSON object to the full_text_list field of the Pydantic object.
However, the model serializer uses:
...
k = f.alias or n
val = serialized.get(k)
...
which means that the field alias (fullTextList) will be used to extract the value rather than the Pydantic field name. This results in value being None and in missing keys in the returned dictionary m when the field name and its alias are different.
To support this claim, please find attached a documents.json file that contains an anonymized response collected from the Glean API (/rest/api/v1/getdocuments endpoint).
And below is a simple debug.py script to run alongside it:
import pathlib
from glean.api_client import models
from glean.api_client.utils.unmarshal_json_response import unmarshal_json_response
class DummyHttpResponse:
def __init__(self, text):
self.status_code = 200
self.text = text
with pathlib.Path("documents.json").open("r") as f:
http_res = DummyHttpResponse(
text=f.read(),
)
documents_response = unmarshal_json_response(models.GetDocumentsResponse, http_res)
assert isinstance(documents_response, models.GetDocumentsResponse)
assert documents_response.documents is not None
assert isinstance(
documents_response.documents["https://company.com/Test"].content,
models.DocumentContent,
)
assert (
documents_response.documents["https://company.com/Test"].content.full_text_list[0]
== "This is a test document."
)
serialized_document_response = documents_response.model_dump()
assert isinstance(serialized_document_response, dict)
assert serialized_document_response["documents"] is not None
# Here's the problem: no `full_text_list` or `fullTextList` in the serialized response!
assert (
len(serialized_document_response["documents"]["https://company.com/Test"]["content"])
> 0
)
Running it yields:
$ ls
debug.py documents.json
$ python debug.py
Traceback (most recent call last):
File "/workspace/app/debug/debug.py", line 40, in <module>
len(serialized_document_response["documents"]["https://company.com/Test"]["content"])
> 0
AssertionError
Note that I'm using:
pydantic_core==2.41.5
pydantic==2.12.5
glean-api-client==0.11.27
- 主要語言
- Python
- 星號
- 20
- 分支
- 10
- 平均合併
- 1 天 6 小時
- 30 天內合併 PR
- 17
貢獻指南
從這裡開始
- 先讀完整個 Issue,再讀專案的貢獻指南。
- 在 Issue 下留言說明你要接手 —— 這能避免兩個人做同樣的事。
- Fork 儲存庫,在一個分支上完成修改。
- 送出 Pull Request,並在描述裡引用這個 Issue 編號。
gleanwork/api-client-python 的其他 Issue
-
難度 2/5 1-3 小時 新手友好度 78/100
gleanwork/api-client-python#136 ·
-
難度 3/5 1-2 天 新手友好度 45/100
gleanwork/api-client-python#137 ·
-
難度 3/5 1-2 天 新手友好度 55/100
gleanwork/api-client-python#133 · 1 則留言 ·
-
難度 4/5 3-5 天 新手友好度 42/100
gleanwork/api-client-python#115 · 4 則留言 ·
-
難度 4/5 3-5 天 新手友好度 25/100
gleanwork/api-client-python#57 · 2 則留言 ·
查看 gleanwork/api-client-python 的全部 Issue
相似的 Issue
-
triage/confirmed
難度 2/5 1-3 小時 新手友好度 88/100
agentscope-ai/agentscope#2775 ·
-
comp/desktop P3 type/bug
難度 1/5 1 小時以內 新手友好度 92/100
NousResearch/hermes-agent#118866 ·
-
bug
難度 1/5 1 小時以內 新手友好度 90/100
apache/cloudstack#14222 ·
-
難度 2/5 1-3 小時 新手友好度 76/100
-
bug
難度 2/5 1-3 小時 新手友好度 82/100