style - variable naming conventions python




Por que usar def main()? (4)

" O que significa if __name__==“__main__”: do? " Já foi respondido.

Ter uma função main() permite chamar sua funcionalidade se você import o módulo. O benefício principal (sem trocadilhos) disso (IMHO) é que você pode testar a unidade.

Duplicata Possível:
O que faz if __name__== "__main__" faz?

Eu vi alguns exemplos de código e tutoriais que usam

def main():
    # my code here

if __name__ == "__main__":
    main()

Mas por que? Existe alguma razão para não definir suas funções na parte superior do arquivo e, em seguida, apenas escrever código sob ele? ou seja

def my_function()
    # my code here

def my_function_two()
    # my code here

# some code
# call function
# print(something)

Eu só me pergunto se há alguma rima para o principal?


Considere o segundo roteiro. Se você importá-lo em outro, as instruções, como "nível global", serão executadas.


Todos os outros já responderam, mas acho que ainda tenho outra coisa para adicionar.

Razões para ter essa declaração if chamando main() (em nenhuma ordem particular):

  • Outras linguagens (como C e Java) possuem uma função main() que é chamada quando o programa é executado. Usando isso, podemos fazer com que o Python se comporte como eles, o que parece mais familiar para muitas pessoas.

  • O código será mais limpo , mais fácil de ler e melhor organizado. (sim, eu sei que isso é subjetivo)

  • Será possível import esse código python como um módulo sem efeitos colaterais desagradáveis.

    • Isso significa que será possível executar testes nesse código.

    • Isso significa que podemos importar esse código para um shell python interativo e testá-lo / depurá-lo.

  • As variáveis ​​dentro do def main são locais , enquanto as externas são globais . Isso pode introduzir alguns bugs e comportamentos inesperados.

Mas, você não é obrigado a escrever uma função main() e chamá-la dentro de uma instrução if .

Eu geralmente começo a escrever pequenos scripts sem qualquer tipo de função. Se o script crescer o suficiente, ou se eu sentir que colocar todo esse código dentro de uma função me beneficiará, então refaterei o código e o farei. Isso também acontece quando escrevo scripts bash .

Mesmo se você colocar o código dentro da função principal, você não é obrigado a escrevê-lo exatamente assim. Uma variação legal poderia ser:

import sys

def main(argv):
    # My code here
    pass

if __name__ == "__main__":
    main(sys.argv)

Isso significa que você pode chamar main() de outros scripts (ou shell interativo) passando parâmetros personalizados. Isso pode ser útil em testes de unidade ou no processamento em lote. Mas lembre-se que o código acima requererá a análise de argv, assim, talvez seja melhor usar uma chamada diferente que passe parâmetros já analisados.

Em um aplicativo orientado a objetos que escrevi, o código ficou assim:

class MyApplication(something):
    # My code here

if __name__ == "__main__":
    app = MyApplication()
    app.run()

Portanto, sinta-se à vontade para escrever o código que melhor lhe convier. :)


se o conteúdo de foo.py

print __name__
if __name__ == '__main__':
    print 'XXXX'

Um arquivo foo.py pode ser usado de duas maneiras.

  • importado em outro arquivo: import foo

Neste caso, __name__ é foo , a seção de código não é executada e não imprime XXXX .

  • executado diretamente: python foo.py

Quando executado diretamente, __name__ é o mesmo que __main__ e o código nessa seção é executado e imprime XXXX

Um do uso desta funcionalidade para escrever vários tipos de testes de unidade dentro do mesmo módulo.







coding-style