(low) decode_to_file.py: f.write(decoded) падает TypeError, если JSON декодируется в list/dict #1399

Closed
opened 2026-06-15 05:52:03 +00:00 by bot-backend · 0 comments
Collaborator

Severity: low · Категория: parsing · Файл: data/sql/decode_to_file.py:6-11

/Users/anton/Птица/gendesign/data/sql/decode_to_file.py:9-11. Скрипт делает decoded = json.loads(raw) (стр.7), открывает файл в режиме 'w' (truncate, стр.9) и пишет f.write(decoded) (стр.10). f.write() требует str. Inline-комментарий на стр.6 сам приводит пример входа "[{"name":"..."}]", который json.loads вернёт как list → f.write(list) кидает TypeError, файл уже усечён до пустого. Дополнительно print '... (len(decoded) chars)' (стр.11) для списка печатает число элементов, а не символов. Импакт минимальный: это утилитарный MCP-helper в data/sql/, не production runtime; ошибка громкая (немедленное исключение), не молчаливая порча. Как чинить: после json.loads проверить тип; если не str — сериализовать обратно (json.dumps(decoded, ensure_ascii=False)) либо явно требовать str и падать с понятным сообщением. Скорректировать docstring/комментарий и подпись 'chars'.

Почему баг: Docstring (стр.1-2) утверждает «Reads JSON-encoded string», но собственный inline-комментарий на стр.6 даёт пример входа "[{\"name\":\"...\"}]" — то есть JSON, который декодируется в СПИСОК объектов, а не в строку. На таком входе json.loads вернёт list → f.write(list) бросает TypeError, и os.makedirs уже создал каталог, а файл создан пустым (truncate в open('w')) до падения → частичная потеря/порча выходного артефакта. Плюс log len(decoded) для списка печатает число элементов, а не «chars», как написано в формате строки.

Как чинить: Привести значение к тексту перед записью: text = decoded if isinstance(decoded, str) else json.dumps(decoded, ensure_ascii=False) и писать text; в логе печатать len(text). Либо заявить контракт «всегда str» и валидировать isinstance(decoded, str) с явной ошибкой, убрав вводящий в заблуждение пример-список из комментария.


deep-audit «армия ботов 2» · verify+harden, confidence 0.9 · unit U60

**Severity:** low · **Категория:** parsing · **Файл:** `data/sql/decode_to_file.py:6-11` /Users/anton/Птица/gendesign/data/sql/decode_to_file.py:9-11. Скрипт делает decoded = json.loads(raw) (стр.7), открывает файл в режиме 'w' (truncate, стр.9) и пишет f.write(decoded) (стр.10). f.write() требует str. Inline-комментарий на стр.6 сам приводит пример входа "[{\"name\":\"...\"}]", который json.loads вернёт как list → f.write(list) кидает TypeError, файл уже усечён до пустого. Дополнительно print '... (len(decoded) chars)' (стр.11) для списка печатает число элементов, а не символов. Импакт минимальный: это утилитарный MCP-helper в data/sql/, не production runtime; ошибка громкая (немедленное исключение), не молчаливая порча. Как чинить: после json.loads проверить тип; если не str — сериализовать обратно (json.dumps(decoded, ensure_ascii=False)) либо явно требовать str и падать с понятным сообщением. Скорректировать docstring/комментарий и подпись 'chars'. **Почему баг:** Docstring (стр.1-2) утверждает «Reads JSON-encoded string», но собственный inline-комментарий на стр.6 даёт пример входа `"[{\"name\":\"...\"}]"` — то есть JSON, который декодируется в СПИСОК объектов, а не в строку. На таком входе json.loads вернёт list → f.write(list) бросает TypeError, и os.makedirs уже создал каталог, а файл создан пустым (truncate в open('w')) до падения → частичная потеря/порча выходного артефакта. Плюс log `len(decoded)` для списка печатает число элементов, а не «chars», как написано в формате строки. **Как чинить:** Привести значение к тексту перед записью: `text = decoded if isinstance(decoded, str) else json.dumps(decoded, ensure_ascii=False)` и писать `text`; в логе печатать `len(text)`. Либо заявить контракт «всегда str» и валидировать `isinstance(decoded, str)` с явной ошибкой, убрав вводящий в заблуждение пример-список из комментария. --- <sub>deep-audit «армия ботов 2» · verify+harden, confidence 0.9 · unit U60</sub>
bot-backend added the
week ревью 1
label 2026-06-15 05:52:03 +00:00
bot-backend added the
scope/backend
label 2026-06-15 11:01:58 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#1399
No description provided.