Como devo organizar o código-fonte do Python? [fechadas]

99

Estou começando com Python (é hora de tentar) e procuro algumas das melhores práticas.

Meu primeiro projeto é uma fila que executa experimentos de linha de comando em vários segmentos. Estou começando a obter um main.pyarquivo muito longo e gostaria de dividi-lo. Em geral, estou procurando: Como os programadores de python organizam vários arquivos de origem? Existe uma estrutura específica que funciona para você?

Minhas perguntas específicas incluem:

  1. Cada classe deve estar em um arquivo separado?
  2. Como devo organizar os testes de unidade relativos ao código-fonte?
  3. Onde devo colocar os comentários do documento, especificamente aqueles para operação de linha de comando?
  4. Se eu usar vários diretórios, como faço para importar classes entre eles?

Provavelmente posso tirar algumas de minhas próprias conclusões aqui por tentativa e erro, mas prefiro começar de algo bom .

Andres Jaan Tack
fonte
4
Isso explicará algumas coisas sobre como organizar seu código docs.python.org/tutorial/modules.html
Nikola Smiljanić
2
Aqui estão mais algumas informações úteis da documentação do python. <br> docs.python.org/3/tutorial/modules.html#packages
rda3mon
11
Esta questão busca uma convenção amplamente aceita, especificamente na comunidade Python. A resposta não é uma questão de opinião, embora, como a maioria das respostas, ela possa mudar com o tempo. Eu sugiro que isso seja reaberto ou, pelo menos, a resposta original recuperada.
Andres Jaan Tack

Respostas:

32

O artigo que Eric apontou é incrível porque cobre detalhes da organização de grandes bases de código Python.

Se você chegou aqui do Google e está tentando descobrir como dividir um grande arquivo de origem em vários arquivos mais gerenciáveis, resumirei o processo brevemente.

Suponha que você atualmente tenha tudo em um arquivo chamado main.py:

  • Crie outro arquivo de origem na mesma pasta (vamos chamar o nosso utils.pypara este exemplo)
  • Mova quaisquer classes, funções, instruções, etc, que você precisa main.pyparautils.py
  • Em main.pyadicionar uma única linha no topo:import utils

Conceitualmente, o que isso faz é criar um novo módulo chamado utilsem outro arquivo de origem. Você pode então importá-lo onde for necessário.

Drew Noakes
fonte
Por acaso você se lembra do artigo que Eric apontou? Não consigo encontrar um Eric nesta pergunta / resposta
Daniel Rucci
7
@DanR, sim, este é o artigo . Por algum motivo, um moderador excluiu sua resposta, apesar de ter 56 votos positivos.
Drew Noakes em
1
@DrewNoakes: Acho que foi excluído por ser uma resposta apenas com link; se ao menos ele tivesse resumido os pontos principais do artigo.
smci
1
Infelizmente, o artigo é um link morto agora :-(. A última versão arquivada está aqui: web.archive.org/web/20190714164001/http://…
Igor Brejc
7

A maneira como você deve organizar seu código e testes é exatamente a mesma que faria para qualquer linguagem OO.

Respostas do jeito que eu faço. Pode não ser certo, mas funciona para mim

  1. Depende de como sua funcionalidade é dividida. Para meu aplicativo python principal, tenho 1 arquivo com classes para os pontos de entrada e pacotes de diferentes bits de funcionalidade
  2. Eu uso PyDev para eclipse e organizo-o como faria para Java.
>  Workspace
>     |
>     |-Src
>     |   |-Package1
>     |   |-Package2
>     |   |-main.py
>     |-Test
>         |-TestPackage1
>         |-TestPackage2
  1. Use DocString em qualquer lugar para manter o controle de tudo
  2. Depois de se certificar de que os __init__.pyarquivos relevantes estão nas pastas. é apenas um simples caso defrom module import class
AutomatedTester
fonte
5
Uma ressalva, porém: java tem uma espécie de relacionamento ditatorial com pacotes, arquivos e classes. Às vezes acabo com muito mais arquivos de origem do que realmente gostaria. As convenções de algumas organizações - por exemplo, evitar classes internas (aninhadas) ou classes "auxiliares" inferiores no arquivo - tornam isso pior, além dos requisitos do compilador. Mantenha a ordem e uma hierarquia é útil, mas tente evitar improvisações.
Roboprog