ctypes: array slice assignment replaces the value's `__len__` exception with a ValueError

Aberta
#161,840 0 comentários 0 reações 0 responsáveis Ver no GitHub

Mantenedores costumam responder em até 1 dia

Ninguém assumiu esta issue ainda.

Avaliação

Dificuldade
3/5
Tempo estimado
1-2 dias
Facilidade para iniciantes
67/100
Tipo de issue
Bug
Clareza
Claramente especificada
Status de atividade
Ativa
Stack de tecnologia
python
Domínio
backend

Direção de pesquisa

Start by locating the ctypes array slice assignment implementation and its tests; the issue identifies PySequence_Length and includes a reproducer using a BadLen class. Trace how a length error is handled before the slice-size comparison, then add a regression test confirming that the KeyError from __len__ propagates. Done means the reproducer raises KeyError("len raised") instead of the size-mismatch ValueError.

Escrita pelo modelo de indexação a partir do texto da issue.

Descrição

extension-modules topic-ctypes type-bug
Bug report

Summary

Assigning a sequence to a slice of a ctypes array calls PySequence_Length on the value. When the value's __len__ raises, PySequence_Length returns -1 with the exception set, and the code reads the -1 as a length. The comparison -1 != slicelen is always true, so it raises its own ValueError("Can only assign sequence of same size") over the pending exception, which replaces it.

Expected: the exception from __len__ should propagate.

Reproducer

import ctypes

class BadLen:
    def __len__(self):
        raise KeyError("len raised")

arr = (ctypes.c_int * 3)()
arr[0:1] = BadLen()
ValueError: Can only assign sequence of same size
CPython versions tested on:

CPython main branch

Operating systems tested on:

Linux

Linked PRs
  • gh-161859
Linguagem predominante
Python
Estrelas
78.2k
Forks
36.6k
Merge médio
19h 57min
PRs com merge (30d)
630

Preparar o ambiente

Abrir no Codespaces

Inicia o contêiner de desenvolvimento do projeto no navegador, com a sua própria conta do GitHub.

Primeiros passos

  1. Leia a issue inteira e depois o guia de contribuição do projeto.
  2. Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
  3. Faça um fork do repositório e trabalhe em uma branch.
  4. Abra um pull request que referencie o número da issue.

Mais de python/cpython

Todas as issues de python/cpython

Issues semelhantes

Mais issues de Python

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.