1
resposta

Dúvidas sobre a def e código não funciona

Então, como na aula o professor diz que a repetição de códigos é má prática, resolvi colocar a condição : if __name__ == "__main__": em uma função. Ficou assim:

#func.py

def main(i):
    if __name__ == "__main__":
        i()

E a importação da função em outra pasta foi:

func.main(jogar)

A idéia era que, quando eu quisesse fazer a condição do 'if name == main :' apenas bastaria chamar a função ' main' que eu criei e mais o nome da função que eu fiz para iniciar o jogo. Porém a função ' main 'não funciona. O terminal fica vazio, o código não inicia. Eu escrevi a função de um jeito errado?

1 resposta

Olá Leonardo, tudo bem com você?

Gostaria de pedir desculpas pela demora em lhe responder.

Quando fazemos o teste para verificarmos se o módulo atual é o __ main__, estamos testando se o arquivo está sendo importado ou sendo executado diretamente. Quando um arquivo é importado a variável __ name__ terá o mesmo nome do arquivo, mas se for executado diretamente através do comando python nome_do_arquivo.py, __ name__ será definido por padrão como __ main__.

Para sabermos em qual modulo estamos podemos usar a função print() para lermos o que o está salvo no __ name__.

print(__name__)

Da forma que foi apresentada em seu código, o que está dentro da condição if não será executado. Toda vez que trabalhamos com a importação de uma função o __ name__ receberá o nome do arquivo, no seu exemplo ele será func fazendo com que o teste do if sempre seja falso. Geralmente, o teste para verificar se está ou não no módulo principal, é feito fora da função, como mostro no exemplo abaixo:

arquivo somatoria.py
def soma():
    print(1 + 2)


if __name__ == '__main__':
    soma()

# Resultado

3

No caso acima, a função soma() só será executada se executarmos diretamente o arquivo somatoria.py, através do comando python somatoria.py, mas, caso estivéssemos importando o arquivo somatoria.py em outro arquivo, a função soma não seria executada, pois, não estaria no contexto do módulo principal (__main__).

Para o seu caso, uma correção que pode ser feita é fazer o teste de verificação dentro do outro arquivo onde você invoca a função main, como mostro abaixo:

# arquivo jogar.py

import func


def jogar():
    print('jogo iniciado')


if __name__ == "__main__":
    func.main(jogar)
# arquivo func.py

def main(i):
    i()

Vale ressaltar que para contornar a repetição de código, uma das coisas que são feitas é a utilização de funções, o trecho if name == __main__, é para evitar que códigos desnecessários sejam executados quando fazemos importação de arquivos em outros. Para saber mais a respeito desse assunto, recomendo a leitura do artigo: Python: O que significa if name == 'main'?

Em caso de mais dúvidas me coloco à disposição.

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!