Quelle est la convention de dénomination en Python pour les noms de variables et de fonctions?

773

Venant d'un arrière-plan C #, la convention de dénomination des variables et des noms de méthode est généralement camelCase ou PascalCase:

// C# example
string thisIsMyVariable = "a"
public void ThisIsMyMethod()

En Python, j'ai vu ce qui précède, mais j'ai également vu des soulignements utilisés:

# python example
this_is_my_variable = 'a'
def this_is_my_function():

Existe-t-il un style de codage définitif plus préférable pour Python?

Rayon
la source

Réponses:

867

Voir Python PEP 8: noms de fonction et de variable :

Les noms de fonction doivent être en minuscules, avec des mots séparés par des traits de soulignement si nécessaire pour améliorer la lisibilité.

Les noms de variable suivent la même convention que les noms de fonction.

mixedCase n'est autorisé que dans des contextes où c'est déjà le style dominant (par exemple threading.py ), pour conserver la compatibilité descendante.

S.Lott
la source
127
PEP = Proposition d'amélioration Python.
Peter Mortensen
8
@RickyRobinson Quel éditeur de code mortel utilisez-vous, qui ne sait pas que le trait de soulignement continue un mot? Beaucoup de gratuits qui le font. J'utilise Notepad ++, si un IDE n'est pas disponible. Pour cela, peut télécharger un modèle pour l'édition python. (D'autres peuvent recommander des téléchargements gratuits encore plus utiles.)
ToolmakerSteve
57
Un cas pour le style souligné est que vous pouvez mieux utiliser des mots d'une lettre. Pour (un exemple plutôt stupide), findMeAClassest peut-être plus laid que find_me_a_class.
heltonbiker
9
Je trouve que la convention des noms de variables tout en minuscules ne convient pas au calcul scientifique, où l'on rencontre souvent des constantes, des tenseurs, etc. bien connus qui sont indiqués par des majuscules.
andreasdr
12
@rr PEP8 est un "Guide de style" et se décrit comme une convention, PAS comme une norme. Il explique également clairement les raisons pour lesquelles ces "règles" ne sont pas toujours respectées.
Le Tahaan
710

Le guide de style Google Python a la convention suivante:

module_name, package_name, ClassName, method_name, ExceptionName, function_name, GLOBAL_CONSTANT_NAME, global_var_name, instance_var_name, function_parameter_name, local_var_name.

Un schéma de dénomination similaire doit être appliqué à un CLASS_CONSTANT_NAME

JohnTESlade
la source
37
a) J'adore les exemples - merci. b) Mélange peu attrayant de CamelCase et de soulignements? Mais: Étant nouveau sur Python et son modèle de données plus flexible, je parie qu'il y a une pensée solide derrière le guide de Google ...
Matthew Cornell
19
Le mélange @MatthewCornell n'est pas mauvais tant que vous vous y tenez. Cela facilite en fait la lisibilité si vous savez que les fonctions ont des traits de soulignement et que les classes n'en ont pas.
Pithikos
1
@MatthewCornell Je ne suppose pas que cela a quelque chose à voir avec le python. Go applique en fait des normes de beauté arbitraires et ne parviendra pas à se compiler si vous n'adhérez pas, par exemple, à leur convention d'accolade. Essentiellement, c'est un lancer de dés pour savoir si quelqu'un a réellement réfléchi ou s'il aime vraiment la façon dont il fait les choses.
Parthian Shot
Considérez-vous un attribut statique constant comme un GLOBAL_CONSTANT_NAME? Ce n'est pas exactement global car c'est dans le cadre de la classe.
James T.
puis entre property... peut-être est-ce une question de ce que l'article prétend être, plutôt que de ce qu'il est réellement
joelb
240

David Goodger (dans "Code Like a Pythonista" ici ) décrit les recommandations de PEP 8 comme suit:

  • joined_lower pour les fonctions, méthodes, attributs, variables

  • joined_lowerou ALL_CAPSpour des constantes

  • StudlyCaps pour les cours

  • camelCase uniquement pour se conformer aux conventions préexistantes

démonté
la source
3
+1 exemples visuels. Bien que je ne puisse pas voir où PEP8 suggère joined_lowerdes constantes , seulement "toutes les lettres majuscules avec des traits de soulignement séparant les mots". Curieux également de la nouvelle fonctionnalité d' énumération .
Bob Stein
1
StudlyCaps for classesest une excellente règle universelle pour les cours dans presque toutes les langues. Alors pourquoi y a-t-il des classes intégrées en python (comme celles datetime.datetimequi ne suivent pas cette convention?
Prahlad Yeri
3
@PrahladYeri: Malheureusement, unittest.TestCase.assertEqualet les amis ne suivent pas non plus la convention snake_case. La vérité est que des parties de la bibliothèque standard de Python ont été développées avant que les conventions ne se soient solidifiées, et nous sommes maintenant coincés avec elles.
wchargin
3
CamelCase est déroutant car certaines personnes disent que c'est "camelCase" (également connu sous le nom de "mixedCase") et certaines personnes disent que c'est "CamelCase" (également connu sous le nom de "StudlyCaps"). Par exemple, le PEP mentionne "CamelCase" tandis que vous mentionnez "camelCase".
Pro Q
votre lien ici est mort, peut-être devrait-il être remplacé par quelque chose comme david.goodger.org/projects/pycon/2007/idiomatic
Wolf
42

Comme le reconnaît le Guide de style pour le code Python ,

Les conventions de dénomination de la bibliothèque de Python sont un peu désordonnées, donc nous n'obtiendrons jamais cela complètement cohérent

Notez que cela se réfère uniquement à la bibliothèque standard de Python . S'ils ne peuvent pas obtenir cette cohérence, alors il n'y a guère d'espoir d'avoir une convention généralement respectée pour tout le code Python, n'est-ce pas?

De cela, et de la discussion ici, je déduirais que ce n'est pas un péché horrible si l'on continue à utiliser, par exemple, les conventions de nommage de Java ou de C # (claires et bien établies) pour les variables et les fonctions lors du passage à Python. Gardant à l'esprit, bien sûr, qu'il est préférable de respecter le style qui prévaut pour une base de code / projet / équipe. Comme le souligne le Guide de style Python, la cohérence interne est primordiale.

N'hésitez pas à me rejeter comme hérétique. :-) Comme l'OP, je ne suis pas "Pythonista", pas encore de toute façon.

Jonik
la source
32

Il y a PEP 8 , comme d'autres réponses le montrent, mais PEP 8 n'est que le guide de style pour la bibliothèque standard, et il n'est considéré que comme un évangile. L'un des écarts les plus fréquents de PEP 8 pour d'autres morceaux de code est la dénomination des variables, en particulier pour les méthodes. Il n'y a pas de style prédominant unique, bien que compte tenu du volume de code qui utilise mixedCase, si l'on devait faire un recensement strict, on se retrouverait probablement avec une version de PEP 8 avec mixedCase. Il y a peu d'autre déviation par rapport à PEP 8 qui est tout aussi courante.

Thomas Wouters
la source
9
Cela a pu être vrai en '08 quand cela a été répondu, mais de nos jours presque toutes les bibliothèques principales utilisent des conventions de dénomination PEP 8.
Thane Brimhall
29

Comme mentionné, PEP 8 dit d'utiliser lower_case_with_underscorespour les variables, les méthodes et les fonctions.

Je préfère utiliser lower_case_with_underscorespour les variables et mixedCasepour les méthodes et fonctions rend le code plus explicite et lisible. Ainsi, suivre le Zen de Python "explicite vaut mieux qu'implicite" et "Nombre de lisibilité"

claytron
la source
3
+1 Je change ces deux-là (j'utilise mixedCase pour les variables), mais avoir tout plus distinct comme ça aide à rendre immédiatement évident ce que vous traitez, d'autant plus que vous pouvez passer des fonctions.
Xiong Chiamiov
2
Bien que la "lisibilité" soit hautement subjective. Je trouve les méthodes avec soulignement plus lisibles.
Pithikos
Votre préférence était mon intuition initiale issue de nombreuses années de développement Java. J'aime utiliser _ pour les variables, mais pour les yeux, cela me semble un peu drôle pour les fonctions et les méthodes.
Michael Szczepaniak
21

suite à ce que @JohnTESlade a répondu. Guide de style python de Google contient des recommandations assez soignées,

Noms à éviter

  • noms de caractère unique, sauf pour les compteurs ou les itérateurs
  • tirets (-) dans n'importe quel nom de module / module
  • \__double_leading_and_trailing_underscore__ names (réservé par Python)

Convention de dénomination

  • "Interne" signifie interne à un module ou protégé ou privé au sein d'une classe.
  • L'ajout d'un seul trait de soulignement (_) prend en charge la protection des variables et des fonctions du module (non inclus avec import * from). L'ajout d'un double trait de soulignement (__) à une variable ou une méthode d'instance permet en fait de rendre la variable ou la méthode privée à sa classe (en utilisant le changement de nom).
  • Regroupez les classes associées et les fonctions de niveau supérieur dans un module. Contrairement à Java, il n'est pas nécessaire de vous limiter à une classe par module.
  • À utiliser CapWordspour les noms de classe, mais lower_with_under.pypour les noms de module. Bien qu'il existe de nombreux modules existants nommés CapWords.py, cela est désormais déconseillé car cela prête à confusion lorsque le module porte le nom d'une classe. ("attends - ai-je écrit import StringIOou from StringIO import StringIO?")

Lignes directrices dérivées des recommandations de Guido entrez la description de l'image ici

Soufiyan Ghori
la source
17

La plupart des gens python préfèrent les soulignés, mais même j'utilise python depuis plus de 5 ans en ce moment, je ne les aime toujours pas. Ils me semblent laids, mais c'est peut-être tout Java dans ma tête.

Je simplement comme CamelCase mieux , car il correspond mieux à la façon dont les classes sont nommées, il se sent plus logique d'avoir SomeClass.doSomething()que SomeClass.do_something(). Si vous regardez autour de l'index du module global en python, vous trouverez les deux, ce qui est dû au fait que c'est une collection de bibliothèques provenant de diverses sources qui ont augmenté au fil du temps et non quelque chose qui a été développé par une entreprise comme Sun avec des règles de codage strictes . Je dirais que l'essentiel est: utilisez ce que vous aimez mieux, c'est juste une question de goût personnel.

André
la source
10
Je viens d'un arrière-plan Java et je trouve les soulignements verbeux et peu attrayants, seul ce dernier étant une opinion. La dénomination est à certains égards un équilibre entre lisibilité et concision. Unix va trop loin, mais son en.wikipedia.org/wiki/Domain-specific_language est limité. CamelCase est lisible en raison des bouchons, mais n'a pas de caractères supplémentaires. 2c
Matthew Cornell
2
Pour moi, les traits de soulignement sont attrayants dans les fonctions / méthodes car je vois chaque trait de soulignement comme un séparateur pour un espace de noms virtuel (dans ma tête). De cette façon , je peux facilement savoir comment nommer mes nouvelles fonctions / méthodes: make_xpath_predicate, make_xpath_expr, make_html_header,make_html_footer
Pithikos
3
Vous n'appelez pas (généralement) SomeClass.doSomething()(les méthodes statiques sont généralement rares) vous appelez habituellementan_instance.do_something()
Dave
15

Personnellement, j'essaie d'utiliser CamelCase pour les classes, les méthodes et les fonctions mixedCase. Les variables sont généralement séparées par des traits de soulignement (si je me souviens bien). De cette façon, je peux dire en un coup d'œil ce que j'appelle exactement, plutôt que tout ce qui se ressemble.

crystalattice
la source
15
Le boîtier Camel commence par une lettre minuscule IIRC comme "camelCase".
UnkwnTech
11
Je pense que crystalattice avait raison - au moins, son utilisation est cohérente avec celle du PEP8 (CamelCase et mixedCase).
Jarrett
1
@UnkwnTech Le terme pour FirstLetterUpper est parfois appelé PascalCase
SurpriseDog
CamelCase ou camelCase? je me demandais juste.
Sumit Pokhrel
11

Il existe un article à ce sujet: http://www.cs.kent.edu/~jmaletic/papers/ICPC2010-CamelCaseUnderScoreClouds.pdf

TL; DR Il est dit que snake_case est plus lisible que camelCase. C'est pourquoi les langues modernes utilisent (ou devraient utiliser) serpent partout où elles le peuvent.

alebian
la source
9
Fait intéressant, il dit également: «Les résultats de cette étude ne s'appliquent pas nécessairement aux identifiants intégrés dans le code source. Il est tout à fait possible que les identifiants en forme de chameau agissent comme un meilleur élément gestalt lorsqu'ils sont intégrés dans des constructions de programmation.
rob3c
2

Le style de codage fait généralement partie des normes internes de politique / convention d'une organisation, mais je pense qu'en général, le style all_lower_case_underscore_separator (également appelé snake_case) est le plus courant en python.

fuentesjr
la source
0

J'utilise personnellement les conventions de dénomination de Java lors du développement dans d'autres langages de programmation car il est cohérent et facile à suivre. De cette façon, je ne me bats pas continuellement sur les conventions à utiliser qui ne devraient pas être la partie la plus difficile de mon projet!

Bradylange
la source
Je suis un peu d'accord. Si la langue X n'est qu'une petite partie du projet, le changement de contexte sur la façon de formater le texte peut être un fardeau. Le hic principal est que les bibliothèques auront des appels dans un style ( library_function(my_arg)).
Lan
-2

En règle générale, on suit les conventions utilisées dans la bibliothèque standard du langage.

yfeldblum
la source