Conventions de dénomination Python pour les modules

102

J'ai un module dont le but est de définir une classe appelée "nib". (et quelques classes connexes aussi.) Comment dois-je appeler le module lui-même? "plume"? "nibmodule"? Rien d'autre?

Ram Rachum
la source

Réponses:

110

Juste plume. Nommez la classe Nib, avec un N. majuscule. Pour en savoir plus sur les conventions de dénomination et d'autres conseils de style, consultez PEP 8 , le guide de style Python.

Stephan202
la source
2
La plupart des projets Python suivent-ils cette convention? Parce que je remarque que les classes intégrées sont en minuscules, par exemple liste, chaîne, etc.
Ram Rachum
4
Votre observation sur les types intégrés est correcte. Ce sont décidément des exceptions, cependant. La plupart des autres classes définies dans la bibliothèque standard sont en majuscules.
Stephan202
2
Je pensais que c'était la bonne convention, mais elle pose un problème inhérent, du moins me semble-t-il. Disons que j'ai une classe appelée Client, et naturellement j'en ferais souvent des instances que je veux appeler client. Mais selon votre convention, le nom du module serait client, et donc je devrais toujours nommer mes instances quelque chose de non naturel comme client_instance. Que pensez-vous de ce problème?
Ray
3
@Ray Mais disons que la convention était de nommer le module Client, alors il entrerait en conflit avec le nom de la classe Client. Puisqu'il n'y a que 3 variantes de dénomination possibles ( client, Clientou CLIENT), il y aura toujours un conflit entre deux des instances, classes, modules ou constantes. Je pense qu'il y a moins de fois que vous nommez votre module de la même manière qu'une instance ou une constante que la classe, et c'est donc la meilleure convention de dénomination des autres possibilités. Cela rendra également l'importation à partir de modules plus lisible puisque vous importez généralement des classes et des constantes plutôt que des variables.
Ted Klein Bergman
2
La raison pour laquelle les fonctions intégrées sont en minuscules est d'implémenter qu'elles sont implémentées en C plutôt qu'en python.
Har
41

Je l'appellerais nib.py. Et je nommerais aussi la classe Nib.

Dans un projet python plus vaste sur lequel je travaille, nous avons de nombreux modules définissant essentiellement une classe importante. Les classes sont nommées en commençant par une majuscule. Les modules sont nommés comme la classe en minuscules. Cela conduit à des importations comme les suivantes:

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

C'est un peu comme émuler la méthode Java. Une classe par fichier. Mais avec la flexibilité supplémentaire, que vous pouvez toujours ajouter une autre classe à un seul fichier si cela a du sens.

rincevent
la source
28

Je sais que ma solution n'est pas très populaire du point de vue pythonique, mais je préfère utiliser l'approche Java d'un module-> une classe, avec le module nommé comme classe. Je comprends la raison du style python, mais je n'aime pas trop avoir un très gros fichier contenant beaucoup de classes. J'ai du mal à parcourir, malgré le pliage.

Une autre raison est le contrôle de version: avoir un fichier volumineux signifie que vos commits ont tendance à se concentrer sur ce fichier. Cela peut potentiellement conduire à une plus grande quantité de conflits à résoudre. Vous perdez également les informations de journal supplémentaires selon lesquelles votre validation modifie des fichiers spécifiques (impliquant donc des classes spécifiques). À la place, vous voyez une modification du fichier du module, avec uniquement le commentaire de validation pour comprendre quelle modification a été effectuée.

En résumé, si vous préférez la philosophie python, optez pour les suggestions des autres articles. Si vous préférez plutôt la philosophie java, créez un Nib.py contenant la classe Nib.

Stefano Borini
la source
2
Les problèmes mentionnés sont dus aux limitations de l'éditeur et à l'utilisation des outils de contrôle de version, et non au langage ou au style de programmation. Une classe par fichier nuit à la structure du code. Utilisez spyderou un éditeur similaire pour voir un résumé de vos classes pour faciliter la navigation, et deux volets avec le même fichier s'ouvrent sur les deux. Veuillez également lire PEP8. Python est pour écrire Python et Java pour Java, mais Python n'est pas pour écrire Java.
Ioannis Filippidis
6
@IoannisFilippidis: Si je devais mettre toutes les classes d'un module dans un seul fichier dans les tailles de code que je gère normalement, je ne pourrais même pas ouvrir le fichier, les collisions avec d'autres collègues monteraient en flèche et mon patron cracherait dans mon visage (au sens figuré, c'est tout) pour le proposer. Une approche à un seul fichier ne s'adapte pas, PEP-8 ou non.
Stefano Borini
3
@StefanoBorini: PEP8 n'appelle pas une approche de fichier unique. Une classe par module et un fichier par (unité de code) sont deux extrêmes d'un très large spectre. Si vous constatez des tailles de fichier incroyablement volumineuses avec un fichier par module, vous devriez peut-être envisager de revoir votre approche pour diviser un package en modules.
Chintalagiri Shashank
22

la plume est bien. En cas de doute, reportez-vous au guide de style Python.

À partir de PEP 8 :

Noms de packages et de modules Les modules doivent avoir des noms courts, entièrement en minuscules. Des traits de soulignement peuvent être utilisés dans le nom du module si cela améliore la lisibilité. Les packages Python doivent également avoir des noms courts, entièrement en minuscules, bien que l'utilisation de traits de soulignement soit déconseillée.

Puisque les noms de module sont mappés aux noms de fichiers, et que certains systèmes de fichiers sont insensibles à la casse et tronquent les noms longs, il est important que les noms de module soient choisis pour être assez courts - ce ne sera pas un problème sous Unix, mais cela peut être un problème lorsque le code est transporté vers d'anciennes versions Mac ou Windows, ou DOS.

Lorsqu'un module d'extension écrit en C ou C ++ a un module Python d'accompagnement qui fournit une interface de niveau supérieur (par exemple plus orientée objet), le module C / C ++ a un trait de soulignement (par exemple _socket).

thedz
la source
1
euh ... ça me frappe dans l'estomac. J'utilise le préfixe de soulignement dans les packages / modules pour quelque chose de complètement différent (référence monty python prévue).
Stefano Borini le
0

À partir de PEP-8: noms des packages et des modules :

Les modules doivent avoir des noms courts, entièrement en minuscules. Des traits de soulignement peuvent être utilisés dans le nom du module si cela améliore la lisibilité.

Les packages Python doivent également avoir des noms courts, entièrement en minuscules, bien que l'utilisation de traits de soulignement soit déconseillée.

Lorsqu'un module d'extension écrit en C ou C ++ a un module Python d'accompagnement qui fournit une interface de niveau supérieur (par exemple plus orientée objet), le module C / C ++ a un trait de soulignement (par exemple _socket).

Ehsan
la source
-3

Le module foo en python serait l'équivalent d'un fichier de classe Foo en Java

ou

module foobar en python serait l'équivalent d'un fichier de classe FooBar en Java

Oded Breiner
la source