python – escreva um programa que facilite o sistema de adoção de acordo com as regras de adoção

Não analisei o enunciado com atenção então se a lógica do código está errada eu não arrumei. Mexi apenas para executar o que se pretende olhando apenas o código.

Eu tirei as chamadas de função str() porque não faz sentido converter para string o que já é string. Não tratei o erro que gerará quando a pessoa digitar algo que não é número onde se espera um número, deixo isso para você, aqui no site tá cheio de exemplo corretos com relação a isso usando try except.

Não é tão simples fazer a lógica quando há caminhos diversos para seguir. Não dá para seguir um único bloco if porque ele executará apenas um desses caminhos, e no caso existem situações que alguns deles serão executados mesmo que os anteriores também sejam.

Na situação simples de verificação pode fazer um único if para definir a não adoção.

Para facilitar a legibilidade do código preferi colocar em uma função e quando a pessoa não consegue adotar ele encerra função. Tem como fazer de outras formas, mas acho essa a mais fácil. Somete mostrará que pode adotar quando não retornar antes, então toda vez que avisar que não pode adotar encerra a função.

O erro se dá porque está tentando verificar o valor de uma variável que não existe, ela só existira se entrasse no elif anterior, porém se entrar no anterior não entra mais no que deu erro, o if é exclusivo, só entra em um deles. Por isso precisa de ifs diferentes e controlar o fluxo de alguma outra forma, como mostra no parágrafo anterior.

Quando uma variável só é criada dentro de um if, usar essa variável só pode acontecer dentro desse if, não pode ser outro if, a existência dele é condicional.

Também não consertei o fato de alguns casos digitar qualquer coisa é o mesmo que escolher sim e tem caso que não, isso é inconsistente e só deveria aceitar a letra específica. Também não acertei para aceitar tanto maiúsculo como minúsculo.

Não sei se eu gosto muito da ordem das perguntas. E os nomes das variáveis poderiam ser mais significativos, foi difícil entender o código com nomes mneumônicos que eu desconheço e não são universais.

def adocao():
    p1 = int(input("Digite a sua idade: "))
    p2 = int(input("Digite a idade do adotando: "))
    p3 = input("Você é irmão ou ascendente do adotando? (S/N): ")
    p4 = input("É adoção conjunta? (S/N): ")
    p5 = input("Os pais do adotando é desconhecido ou ele foi destituído do poder familiar? (S/N): ")
    if p1 < 18 or p1 - p2 < 16 or p3 == "S":
        print("Você não pode adotar!!")
        return
    if p4 == "S":
        p6 = input("Vocês são casados ou possui união estável? (S/N): ")
        if p6 == "N":
            print("Você não pode adotar!!")
            return
    if p5 == "N":
        p7 = input("Os pais do adotando consentiu a adoção? (S/N): ")
        if p7 == "N":
            print("Você não pode adotar!!")
            return
    if p5 == "S" and p2 >= 12:
        p8 = input("O adotando consentiu essa adoção? (S/N): ")
        if p8 == "N":
            print("Você não pode adotar!!")
            return
    print("PARABÉNS!! VOCÊ PODE ADOTAR.")
    
adocao()