1
resposta

[Dúvida] Esta conforme ?

import asyncio

cursos = {
    "Python Avançado": {"vagas": 2, "inscritos": []},
    "Java para Iniciantes": {"vagas": 1, "inscritos": []},
    "Machine Learning": {"vagas": 0, "inscritos": []},
}

alunos = [
    {"nome": "Alice", "curso": "Python Avançado"},
    {"nome": "Bruno", "curso": "Python Avançado"},
    {"nome": "Carlos", "curso": "Java para Iniciantes"},
    {"nome": "Daniela", "curso": "Machine Learning"},
    {"nome": "Alice", "curso": "Python Avançado"},  # Inscrição duplicada
]


async def inscrever_aluno(aluno):
    nome = aluno["nome"]
    curso_nome = aluno["curso"]

    if curso_nome not in cursos:
        print("Erro: Curso '{}' não encontrado.".format
              (curso_nome))
        return

    curso = cursos[curso_nome]

    if nome in curso["inscritos"]:
        print("Aviso: {} já está inscrito(a) no curso {}.".format
              (nome, curso_nome))
        return

    if len(curso["inscritos"]) >= curso["vagas"]:
        print("Não há vagas disponíveis no curso {} para {}.".format
              (curso_nome, nome))
        return

    curso["inscritos"].append(nome)
    print("{} foi inscrito(a) com sucesso no curso {}.".format
          (nome, curso_nome))

    await asyncio.sleep(1)  # Simula processamento assíncrono


async def main():
    print("Iniciando processo de inscrições...")
    print("==================================")

    tarefas = [inscrever_aluno(aluno) for aluno in alunos]

    await asyncio.gather(*tarefas)

    print("\nResumo das inscrições:")
    print("=====================")

    for curso_nome, dados in cursos.items():
        print("\nCurso: {}".format
              (curso_nome))

        print("Vagas totais: {}".format
              (dados["vagas"]))

        print("Vagas preenchidas: {}".format
              (len(dados["inscritos"])))

        if dados["inscritos"]:
            print("Alunos inscritos: {}".format
                  (", ".join(dados["inscritos"])))
        else:
            print("Alunos inscritos: Nenhum")


if __name__ == "__main__":
    asyncio.run(main())
1 resposta

Oii, Samuel! Como você está?

Parabéns pela resolução do exercício! É muito legal ver que você não apenas resolveu o problema, mas também adicionou funcionalidades extras, como o relatório final ("Resumo das inscrições"). Isso demonstra uma visão de produto muito boa.

Respondendo sua dúvida: Sim, está conforme e funcional! Seu código roda perfeitamente e respeita a lógica assíncrona.

Para te ajudar a ir além, separei alguns pontos para analisarmos juntos:

1. Lógica de vagas (Interpretação vs. Requisito)
Você utilizou uma lógica de Capacidade Máxima:

  • Você compara o número de inscritos (len) com o número definido na chave "vagas".
  • Vantagem: O número original de vagas (capacidade) se mantém preservado nos dados.
  • Ponto de atenção: O enunciado pedia: "Se houver vagas... a vaga deve ser reduzida". O instrutor implementou um contador regressivo (consumo de recurso). Embora sua lógica funcione perfeitamente para barrar novos alunos, em sistemas reais de reserva (como ingressos), costumamos "decrementar" a vaga disponível para evitar condições de corrida (quando dois processos leem que há vaga ao mesmo tempo).

2. Criação de tarefas
Você passou a lista de corrotinas direto para o gather. Funciona, mas usar asyncio.create_task() (como o instrutor fez) é interessante porque ele já "agenda" a execução da tarefa no event loop imediatamente, mesmo antes de chegar no gather.

Mas, sua solução foi excelente e mostrou criatividade no relatório final. A lógica está correta, os ajustes acima são apenas para alinhar com práticas modernas e com a minúcia do enunciado sobre "reduzir vagas".

Continue praticando assim!

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!