Repository navigation
Saída polars: pânico do polars na conversão final vira coluna Object - #236
Conversation
Com entrada polars, um campo Decimal com valor acima de 38 dígitos derrubava a saída depois de todas as chamadas: o pyarrow entrega o valor em 256 bits, o polars entra em pânico ao lê-lo, e o PanicException, que herda de BaseException, passava pelo except Exception de from_pandas. O except passa a capturar também pl.exceptions.PanicException, e a coluna sai Object com aviso, como as demais que o polars recusa. BaseException continua fora, para que o KeyboardInterrupt suba. Closes #230
EvidênciaO caso da issue, na
|
| Caso | Esperado | main |
Branch |
|---|---|---|---|
Decimal com 1E+40, polars 2.0.0 |
coluna Object com os valores e aviso |
PanicException |
Object, [Decimal('1.5'), Decimal('1E+40'), Decimal('2')], aviso |
| O mesmo, polars 1.0.0 | idem | PanicException |
idem |
Optional[dict[str, int]] com {} e None, polars 1.9.0 |
sem pânico | String, ['{}', None], sem aviso |
idem; o campo dict já sai em texto JSON desde o #232 e não chega ao pânico |
Any com {} e None, polars 1.9.0 |
coluna Object com aviso |
PanicException (invalid struct) |
Object, [{}, None], aviso |
KeyboardInterrupt na conversão de uma coluna |
sobe até o chamador | sobe | sobe |
Testes
Novos em tests/test_entrada_e_saida.py:
decimal_acima_de_38_digitos, caso novo do parametrizadotest_campo_que_o_arrow_nao_tipa_sai_como_object_com_os_valores_do_pandas: reprova namaincomPanicException(polars 2.0.0 e 1.0.0) e passa no branch.test_interrupcao_na_conversao_da_saida_polars_sobe_em_vez_de_virar_object: oKeyboardInterruptlevantado na conversão de uma coluna sobe. Passa namaine no branch; guarda contra capturarBaseException.
Suíte inteira, mesmo ambiente para main e branch (pytest, sem o extra codex, como o job unit):
| Ambiente | main |
Branch |
|---|---|---|
Python 3.13, polars 2.0.0 (dev all search-all) |
1220 passed, 105 skipped | 1222 passed, 105 skipped |
Python 3.11, polars 2.0.0 (dev all search-all) |
1220 passed, 105 skipped | 1222 passed, 105 skipped |
Python 3.11, lowest-direct com all excel polars search-all (polars 1.0.0, pyarrow 10.0.1, pandas 2.1.2) |
1219 passed, 106 skipped | 1221 passed, 106 skipped |
| Python 3.11, polars 1.9.0 | não rodado | 1222 passed, 105 skipped |
Testes do branch sobre o código da main, Python 3.13 e 3.11 |
1 failed (decimal_acima_de_38_digitos), 1221 passed, 105 skipped |
Os 105 pulados são do provider codex sem o SDK instalado e de parâmetros vazios; no lowest-direct, o 106º é langchain-core sem ModelError. São os mesmos na main e no branch.
Cobertura de ramos de src/dataframeit/utils.py, somando 3.13 e 3.11: 338 linhas, 170 ramos, 100%.
Qualidade, com os extras do job quality: ruff format --check src tests, ruff check src tests, ty check, vulture e deptry src passam.
Mutações, cada uma numa cópia de src com o import conferido:
| Mutação | Resultado |
|---|---|
except Exception: (desfaz a correção) |
reprova decimal_acima_de_38_digitos |
except BaseException: |
reprova test_interrupcao_na_conversao_da_saida_polars_sobe_em_vez_de_virar_object |
SHA revisado: 7476876
Revisão independente de
|
O quê
Com entrada polars, um campo
Decimalcom valor acima de 38 dígitos derrubava a saída depois de todas as chamadas ao provider. O pyarrow entrega o valor em 256 bits, o polars entra em pânico ao lê-lo, e oPanicException, que herda deBaseException, passava peloexcept Exceptiondefrom_pandas. Com entrada pandas, o mesmo modelo devolvia a coluna.Como
O
exceptdefrom_pandaspassa a capturar tambémpl.exceptions.PanicException, presente do polars 1.0.0 ao 2.0.0, e a coluna saiObjectcom aviso, como as demais que a conversão recusa.BaseExceptionfica fora, para que oKeyboardInterruptcontinue subindo. O comentário dotrydescreve o que o código captura agora.O mesmo
exceptcobre o pânico do polars 1.6.0 a 1.9.0 com{}ao lado deNonenum campoAny. No campoOptional[dict[str, int]], citado na issue, esse pânico já não acontece: desde o #232 o campo dict sai em texto JSON.Testes
decimal_acima_de_38_digitosno parametrizado dos campos que o polars não tipa: reprova namaincomPanicExceptione passa aqui.test_interrupcao_na_conversao_da_saida_polars_sobe_em_vez_de_virar_object: oKeyboardInterruptna conversão de uma coluna sobe até o chamador.Closes #230