Convenções de nomenclatura Python para módulos

102

Eu tenho um módulo cujo objetivo é definir uma classe chamada "nib". (e algumas classes relacionadas também.) Como devo chamar o próprio módulo? "bico"? "nibmodule"? Algo mais?

Ram Rachum
fonte

Respostas:

110

Apenas nib. Nomeie a classe Nib, com N maiúsculo. Para obter mais informações sobre convenções de nomenclatura e outros conselhos de estilo, consulte PEP 8 , o guia de estilo do Python.

Stephan202
fonte
2
A maioria dos projetos Python segue essa convenção? Porque noto que as classes integradas estão em minúsculas, por exemplo, lista, string, etc.
Ram Rachum,
4
Sua observação sobre os tipos integrados está correta. No entanto, são decididamente exceções. A maioria das outras classes definidas na biblioteca padrão são capitalizadas.
Stephan202,
2
Achei que essa era a convenção correta, mas há um problema inerente a ela, pelo menos me parece. Digamos que eu chamei uma classe Cliente, compreensivelmente, muitas vezes eu criaria ocorrências dela que gostaria de chamar client. Mas, de acordo com sua convenção, o nome do módulo seria cliente, portanto, sempre teria que nomear minhas instâncias com algo não natural como client_instance. O que você acha desse problema?
Ray
3
@Ray Mas digamos que a convenção fosse nomear o módulo Client, então ela entraria em conflito com o nome da classe Client. Uma vez que existem apenas 3 possível nomeação variantes ( client, Clientou CLIENT) sempre haverá um confronto entre duas das instâncias, classes, módulos ou constantes. Acredito que haja menos vezes que você nomeie seu módulo da mesma forma que uma instância ou constante do que a classe e, portanto, é a melhor convenção de nomenclatura das outras possibilidades. Também tornará a importação de módulos mais legível, já que geralmente você importa classes e constantes em vez de variáveis.
Ted Klein Bergman
2
A razão pela qual os builtins estão em minúsculas é para sugerir que eles são implementados em C em vez de python.
Har
41

Eu o chamaria de nib.py. E eu também nomearia a classe Nib.

Em um projeto python maior no qual estou trabalhando, temos muitos módulos que definem basicamente uma classe importante. As classes são nomeadas começando com uma letra maiúscula. Os módulos são nomeados como a classe em letras minúsculas. Isso leva a importações como as seguintes:

from nib import Nib
from foo import Foo
from spam.eggs import Eggs, FriedEggs

É um pouco como emular o método Java. Uma aula por arquivo. Mas com a flexibilidade adicional, você pode sempre adicionar outra classe a um único arquivo, se fizer sentido.

Rincewind
fonte
27

Sei que minha solução não é muito popular do ponto de vista pythônico, mas prefiro usar a abordagem Java de um módulo-> uma classe, com o módulo nomeado como a classe. Eu entendo a razão por trás do estilo python, mas não gosto muito de ter um arquivo muito grande contendo muitas classes. Acho difícil navegar, apesar de dobrar.

Outra razão é o controle de versão: ter um arquivo grande significa que seus commits tendem a se concentrar naquele arquivo. Isso pode potencialmente levar a uma maior quantidade de conflitos a serem resolvidos. Você também perde as informações de log adicionais de que seu commit modifica arquivos específicos (portanto, envolvendo classes específicas). Em vez disso, você vê uma modificação no arquivo do módulo, com apenas o comentário de confirmação para entender qual modificação foi feita.

Resumindo, se você prefere a filosofia python, siga as sugestões dos outros posts. Se você preferir a filosofia semelhante ao java, crie um Nib.py contendo a classe Nib.

Stefano Borini
fonte
1
Os problemas mencionados são causados ​​por limitações no editor e no uso de ferramentas de controle de versão, não pela linguagem ou estilo de programação. Uma classe por arquivo é prejudicial à estrutura do código. Use spyderou um editor semelhante para ver um resumo de suas classes para auxiliar a navegação e dois painéis com o mesmo arquivo aberto em ambos. Além disso, leia PEP8. Python é para escrever Python e Java para Java, mas Python não é para escrever Java.
Ioannis Filippidis
5
@IoannisFilippidis: Se eu tivesse que colocar todas as classes de um módulo em um único arquivo nos tamanhos de código que normalmente gerencio, eu nem seria capaz de abrir o arquivo, colisões com outros colegas disparariam e meu chefe cuspiria na minha cara (figurativamente, é isso) para propô-lo. Uma abordagem de arquivo único não é escalável, PEP-8 ou não.
Stefano Borini
2
@StefanoBorini: O PEP8 não exige uma abordagem de arquivo único. Uma classe por módulo e um arquivo por (unidade de código) são dois extremos de um espectro muito amplo. Se você estiver vendo tamanhos de arquivo grandes de maneira não gerenciável com um arquivo por módulo, talvez deva considerar revisar sua abordagem para dividir um pacote em módulos.
Chintalagiri Shashank
22

bico está bem. Em caso de dúvida, consulte o guia de estilo do Python.

Do PEP 8 :

Nomes de pacotes e módulos Os módulos devem ter nomes curtos, todos em minúsculas. Sublinhados podem ser usados ​​no nome do módulo se melhorar a legibilidade. Os pacotes Python também devem ter nomes curtos, todos em minúsculas, embora o uso de sublinhados seja desencorajado.

Uma vez que os nomes dos módulos são mapeados para os nomes dos arquivos e alguns sistemas de arquivos não diferenciam maiúsculas de minúsculas e truncam os nomes longos, é importante que os nomes dos módulos sejam bem curtos - isso não será um problema no Unix, mas pode ser um problema quando o código é transportado para versões mais antigas do Mac ou Windows, ou DOS.

Quando um módulo de extensão escrito em C ou C ++ tem um módulo Python que o acompanha que fornece uma interface de nível superior (por exemplo, mais orientada a objetos), o módulo C / C ++ tem um sublinhado à esquerda (por exemplo, _socket).

thedz
fonte
1
uhm ... isso me bate no estômago. Estou usando o prefixo de sublinhado em pacotes / módulos para algo completamente diferente (referência monty python pretendida).
Stefano Borini,
0

Do PEP-8: Nomes de pacotes e módulos :

Os módulos devem ter nomes curtos, todos em minúsculas. Sublinhados podem ser usados ​​no nome do módulo se melhorar a legibilidade.

Os pacotes Python também devem ter nomes curtos, todos em minúsculas, embora o uso de sublinhados seja desencorajado.

Quando um módulo de extensão escrito em C ou C ++ tem um módulo Python acompanhante que fornece uma interface de nível superior (por exemplo, mais orientada a objetos), o módulo C / C ++ tem um sublinhado inicial (por exemplo, _socket).

Ehsan
fonte
-3

O módulo foo em python seria o equivalente a um arquivo de classe Foo em Java

ou

O módulo foobar em python seria o equivalente a um arquivo de classe FooBar em Java

Oded Breiner
fonte