is_printable_as_block_string checks each character in a Python loop

Aberta Para iniciantes
#312 0 comentários 0 reações 0 responsáveis Ver no GitHub

Mantenedores costumam responder em até 1 dia

@dexhunter já está trabalhando nisso.

Desde 7/11/2026.

  • #313 de @dexhunter — aberto

Avaliação

Dificuldade
2/5
Tempo estimado
1-3 horas
Facilidade para iniciantes
83/100
Tipo de issue
Refatoração
Clareza
Claramente especificada
Status de atividade
Ativa
Stack de tecnologia
python
Domínio
performance

Direção de pesquisa

Leia is_printable_as_block_string() e as quatro verificações correspondentes em GraphQL.js; em seguida, examine tests/language/test_block_string.py para identificar a cobertura do comportamento existente. Substitua o loop de caracteres pelas verificações descritas com métodos de string, preservando os resultados para todas as entradas. Execute esse arquivo de teste e compare os casos medidos; o trabalho estará concluído quando o comportamento permanecer igual e os casos com descrições longas apresentarem o ganho de velocidade informado.

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

Descrição

print_schema() and print_ast() call is_printable_as_block_string() once for each description. The function walks the string one character at a time in a Python for loop. It keeps four boolean flags for each character. For long descriptions, this loop is a large part of the time that print_schema() uses.

Measured with Python 3.12 on one isolated CPU core (best of 7 runs):

Situation Now With str methods Change
One-line description (30 chars) 1405 ns 184 ns 87% less time
Description with 12 lines 19.2 µs 2.7 µs 86% less time
print_schema() of the GitHub schema fixture 25.5 ms 16.3 ms 36% less time
String that starts with a new line 106 ns 427 ns 0.3 µs slower

The last row is the only slower case. The old loop stops at the first character there. Such strings are rare in real schemas.

Proposed fix: keep the same checks, but use str methods instead of the character loop. A str.isprintable() pre-check and a regex find control characters. Then str.split("\n") gives the lines for the leading, trailing and indent checks. The result stays the same for all inputs, and tests/language/test_block_string.py passes.

This is a Python-specific change only. It keeps the four rules of isPrintableAsBlockString in GraphQL.js as four short checks with the same comments, so a later sync with upstream stays easy.

Environment: graphql-core main (1d505c1), CPython 3.12.13, Linux x86_64.

Linguagem predominante
Python
Estrelas
534
Forks
159
Merge médio
1d 18h
PRs com merge (30d)
9

Preparar o ambiente

  • Sem Dockerfile nem arquivo Docker Compose
  • Tem um modelo de pull request
  • Sem guia de contribuição

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 graphql-python/graphql-core

Todas as issues de graphql-python/graphql-core

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.