Refatore o código existente da biblioteca Python com segurança
sorted, compreensões e next do Python podem expressar a intenção com clareza, mas têm
semânticas diferentes de cópia e mutação. Preserve o comportamento do qual os usuários dependem.
Resumo do laboratório

Ilustração conceitual original (SVG)
| Em resumo | Sua rota |
|---|---|
| Nível e tempo | 300; 60 minutos (estimativa de facilitação) |
| Ação inicial | Teste duplicatas, empates e mutação antes de simplificar a iteração. |
| Materiais do aluno | Baixe 05-python.zip |
| Workspace | Abra a raiz do kit extraído; execute a baseline de library relativa a essa raiz |
| Verificação inicial esperada | Os testes unittest existentes são descobertos e passam. |
| Ajuda de configuração | Baixe, extraia, Git local e GitHub opcional |
[!NOTE] sorted e list.sort não são contratos intercambiáveis.
Conceitos · Primeira tarefa · Lista de evidências · Redefinir
Objetivos de aprendizagem
- Identifique o que a filtragem/ordenação realmente retorna e modifica.
- Preserve a semântica de caixa e de resultado ausente.
- Use caracterização antes de substituir laços.
Antes de começar
Prepare 05-python usando o guia de configuração.
Execute os comandos a partir de library na
fixture de refatoração Python incluída.
Conceitos e casos de uso
| Código existente | Armadilha semântica |
|---|---|
A busca de usuários por substring usa lower() |
Mudar para uma verificação de pertencimento que diferencia maiúsculas e minúsculas altera os resultados |
| Um bubble sort ordena os nomes correspondentes | Substituí-lo por um conjunto perde duplicatas e ordem |
sort_loans_by_due_date modifica a lista de empréstimos |
sorted(...) retorna uma nova lista em vez disso |
A consulta retorna None para ID ausente |
next(...) sem valor padrão lança exceção |
| As entidades retornadas são objetos compartilhados | Uma cópia profunda pode alterar as suposições dos chamadores |
Cenário do exercício
Simplifique um método de busca de usuários ou de ordenação de empréstimos sem alterar o contrato observável. A análise de desempenho é um exercício separado; não prometa ganhos de velocidade.
Tarefa 1 - Estabeleça os testes e o comportamento atual
python -m unittest discover -s tests -p "test_*.py" -v
- Leia os métodos do repositório e seus chamadores.
- Caracterize entrada vazia, IDs ausentes, nomes com mistura de caixa, nomes de exibição duplicados, datas iguais e mutação da lista original.
- Registre as suposições sobre data/hora. Use datas controladas nos testes.
- Mantenha a leitura/gravação de JSON fora da primeira refatoração, a menos que seja explicitamente testada.
Tarefa 2 - Compare alternativas com Ask
Compare the existing manual search/sort with comprehension, sorted, list.sort,
and next alternatives. Explain which returns a new list, which mutates, how ties
are handled, and what missing-result behavior must be preserved. Do not edit.
Não presuma que uma expressão de uma linha seja mais clara ou que o comportamento do repositório de outra linguagem se aplique aqui.
Tarefa 3 - Planeje e implemente um recorte
- Em Plan, escolha um método e liste a semântica preservada e os testes.
- Peça a Agent que implemente somente esse recorte.
- Inspecione tipo de retorno, identidade, ordenação e mutação.
- Execute os testes direcionados e a suíte existente.
- Introduza uma diferença deliberada, como substituir a ordenação no próprio objeto por uma cópia ordenada retornada. Confirme que o teste de caracterização apropriado falha.
- Restaure a refatoração correta e registre as limitações.
Verifique seu trabalho
- O comportamento para ID ausente permanece inalterado.
- A normalização da busca e a ordenação permanecem iguais.
- Resultados modificados no próprio objeto versus copiados são testados explicitamente.
- A ordem de chaves iguais e as duplicatas não são perdidas acidentalmente.
- A mutação negativa falha e os comportamentos sem relação com a tarefa continuam passando.
Solução de problemas
Se apenas instantâneos forem comparados, você pode deixar de detectar a mutação de objetos. Se a refatoração alterar
o tratamento de erros, classifique-a como uma correção separada. Se as importações falharem, execute a partir de library
em vez de adicionar edições improvisadas de sys.path.
Prática independente
Refatore uma operação de atualização preservando exatamente quando save_loans e
load_data são invocados. Teste o comportamento de registro ausente sem inventar uma nova política.
Restauração
Salve as evidências, restaure somente o método e os testes selecionados na cópia descartável e feche a sessão de aprendizagem. Deixe os interpretadores compartilhados e os dados de origem intactos.