Convenciones de nomenclatura de Python para módulos

102

Tengo un módulo cuyo propósito es definir una clase llamada "nib". (y también algunas clases relacionadas). ¿Cómo debo llamar al módulo en sí? "punta"? "nibmodule"? ¿Algo más?

Ram Rachum
fuente

Respuestas:

110

Solo punta. Nombre la clase Nib, con una N mayúscula. Para obtener más información sobre las convenciones de nomenclatura y otros consejos de estilo, consulte PEP 8 , la guía de estilo de Python.

Stephan202
fuente
2
¿La mayoría de los proyectos de Python siguen esta convención? Porque noto que las clases integradas están en minúsculas, por ejemplo, lista, cadena, etc.
Ram Rachum
4
Su observación sobre los tipos incorporados es correcta. Sin embargo, estas son decididamente excepciones. La mayoría de las otras clases definidas en la biblioteca estándar están en mayúscula.
Stephan202
2
Pensé que esta era la convención correcta, pero hay un problema inherente con ella, al menos me parece. Digamos que tengo una clase llamada Clienty, comprensiblemente, a menudo hago instancias de ella que quiero llamar client. Pero de acuerdo con su convención, el nombre del módulo sería client, por lo que siempre tendría que nombrar mis instancias como algo antinatural client_instance. ¿Qué opinas de este problema?
Ray
3
@Ray Pero digamos que la convención era nombrar el módulo Client, entonces chocaría con el nombre de la clase Client. Puesto que hay sólo variantes 3 posible de nomenclatura ( client, Cliento CLIENT) siempre habrá un choque entre dos de instancias, clases, módulos o constantes. Creo que hay menos ocasiones en las que nombra su módulo como una instancia o constante que la clase y, por lo tanto, es la mejor convención de nomenclatura de las otras posibilidades. También hará que la importación de módulos sea más legible, ya que generalmente importa clases y constantes en lugar de variables.
Ted Klein Bergman
2
La razón por la que las incorporaciones están en minúsculas es para implicar que están implementadas en C en lugar de Python.
Har
41

Yo lo llamaría nib.py. Y también nombraría la clase Nib.

En un proyecto de Python más grande en el que estoy trabajando, tenemos muchos módulos que definen básicamente una clase importante. Las clases se nombran comenzando con una letra mayúscula. Los módulos se denominan como la clase en minúsculas. Esto conduce a importaciones como las siguientes:

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

Es un poco como emular el método Java. Una clase por archivo. Pero con la flexibilidad adicional, siempre puede agregar otra clase a un solo archivo si tiene sentido.

Rincewind
fuente
27

Sé que mi solución no es muy popular desde el punto de vista pitónico, pero prefiero usar el enfoque de Java de un módulo -> una clase, con el módulo nombrado como clase. Entiendo la razón detrás del estilo Python, pero no me gusta mucho tener un archivo muy grande que contenga muchas clases. Me resulta difícil navegar, a pesar de estar plegado.

Otra razón es el control de versiones: tener un archivo grande significa que sus confirmaciones tienden a concentrarse en ese archivo. Potencialmente, esto puede conducir a una mayor cantidad de conflictos por resolver. También pierde la información de registro adicional de que su confirmación modifica archivos específicos (por lo tanto, involucra clases específicas). En su lugar, verá una modificación en el archivo del módulo, con solo el comentario de confirmación para comprender qué modificación se ha realizado.

En resumen, si prefiere la filosofía de Python, busque las sugerencias de las otras publicaciones. Si prefiere la filosofía similar a java, cree un Nib.py que contenga la clase Nib.

Stefano Borini
fuente
1
Los problemas mencionados son causados ​​por limitaciones en el editor y en el uso de herramientas de control de versiones, no por el lenguaje o el estilo de programación. Una clase por archivo es perjudicial para la estructura del código. Use spydero un editor similar para ver un resumen de sus clases para ayudar a la navegación, y dos paneles con el mismo archivo abierto en ambos. Además, lea PEP8. Python es para escribir Python y Java para Java, pero Python no es para escribir Java.
Ioannis Filippidis
5
@IoannisFilippidis: Si tuviera que poner todas las clases para un módulo en un solo archivo en los tamaños de código que normalmente administro, ni siquiera podría abrir el archivo, las colisiones con otros colegas se dispararían y mi jefe escupiría en mi cara (en sentido figurado, eso es todo) por proponerlo. Un enfoque de archivo único no se escala, PEP-8 o no.
Stefano Borini
2
@StefanoBorini: PEP8 no requiere un enfoque de archivo único. Una clase por módulo y un archivo por (unidad de código) son dos extremos de un espectro muy amplio. Si observa tamaños de archivo inmanejables con un archivo por módulo, quizás debería considerar revisar su enfoque para dividir un paquete en módulos.
Chintalagiri Shashank
22

la punta está bien. En caso de duda, consulte la guía de estilo de Python.

Desde PEP 8 :

Nombres de paquetes y módulos Los módulos deben tener nombres cortos en minúsculas. Se pueden usar guiones bajos en el nombre del módulo si mejora la legibilidad. Los paquetes de Python también deben tener nombres cortos en minúsculas, aunque se desaconseja el uso de guiones bajos.

Dado que los nombres de los módulos se asignan a los nombres de los archivos, y algunos sistemas de archivos no distinguen entre mayúsculas y minúsculas y truncan los nombres largos, es importante que los nombres de los módulos sean bastante cortos; esto no será un problema en Unix, pero puede ser un problema. problema cuando el código se transporta a versiones anteriores de Mac o Windows, o DOS.

Cuando un módulo de extensión escrito en C o C ++ tiene un módulo Python adjunto que proporciona una interfaz de nivel superior (por ejemplo, más orientada a objetos), el módulo C / C ++ tiene un subrayado inicial (por ejemplo, _socket).

thedz
fuente
1
uhm ... esto me golpea en el estómago. Estoy usando el prefijo de subrayado en paquetes / módulos para algo completamente diferente (se pretende la referencia de monty python).
Stefano Borini
0

De PEP-8: Nombres de módulos y paquetes :

Los módulos deben tener nombres cortos en minúsculas. Se pueden usar guiones bajos en el nombre del módulo si mejora la legibilidad.

Los paquetes de Python también deben tener nombres cortos en minúsculas, aunque se desaconseja el uso de guiones bajos.

Cuando un módulo de extensión escrito en C o C ++ tiene un módulo Python adjunto que proporciona una interfaz de nivel superior (por ejemplo, más orientada a objetos), el módulo C / C ++ tiene un subrayado inicial (por ejemplo, _socket).

Ehsan
fuente
-3

El módulo foo en python sería equivalente a un Foo archivo de clase en Java

o

El módulo foobar en python sería el equivalente a un archivo de clase FooBar en Java

Oded Breiner
fuente