¿Cuál es la convención de nomenclatura en Python para nombres de variables y funciones?

773

Viniendo de un fondo de C #, la convención de nomenclatura para variables y nombres de métodos suele ser camelCase o PascalCase:

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

En Python, he visto lo anterior pero también he visto que se usan guiones bajos:

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

¿Existe un estilo de codificación más preferible y definitivo para Python?

Rayo
fuente

Respuestas:

867

Ver Python PEP 8: Nombres de funciones y variables :

Los nombres de las funciones deben estar en minúsculas, con palabras separadas por guiones bajos según sea necesario para mejorar la legibilidad.

Los nombres de las variables siguen la misma convención que los nombres de las funciones.

mixedCase solo se permite en contextos donde ese es el estilo predominante (por ejemplo, threading.py ), para mantener la compatibilidad con versiones anteriores.

S.Lott
fuente
127
PEP = Propuesta de mejora de Python.
Peter Mortensen el
8
@RickyRobinson ¿Qué editor de código con muerte cerebral estás usando, que no sabe que el guión bajo continúa una palabra? Un montón de gratis que lo hacen. Yo uso Notepad ++, si un IDE no está disponible. Para eso, puede descargar una plantilla para editar en python. (Otros pueden recomendar descargas gratuitas aún más útiles).
ToolmakerSteve
57
Un caso para el estilo subrayado es que puede usar mejor las palabras de una letra. Por ejemplo (un poco tonto), findMeAClasses quizás más feo que find_me_a_class.
heltonbiker
99
Me parece que la convención de nombres de variables en minúsculas no es adecuada en la informática científica, donde a menudo se encuentran constantes, tensores, etc. bien conocidos que se denotan con letras mayúsculas.
andreasdr
12
@rr PEP8 es una "Guía de Estilo", y se describe a sí misma como una Convención, NO como un Estándar. También explica claramente las razones por las cuales no siempre se siguen esas "reglas".
El Tahaan
710

La Guía de estilo de Google Python tiene la siguiente convención:

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.

Se debe aplicar un esquema de nomenclatura similar a un CLASS_CONSTANT_NAME

JohnTESlade
fuente
37
a) Me encantan los ejemplos, gracias. b) ¿Mezcla poco atractiva de CamelCase y guiones bajos? Pero: siendo nuevo en Python y su modelo de datos más flexible, apuesto a que hay una reflexión sólida detrás de la guía de Google ...
Matthew Cornell
19
La mezcla de @MatthewCornell no es mala, siempre y cuando te apegues a ella. Realmente facilita la legibilidad si sabe que las funciones tienen guiones bajos y las clases no.
Pithikos
1
@MatthewCornell No asumiría que tiene algo que ver con Python. Ir realmente aplica estándares arbitrarios de belleza y no se compilará si no cumple, por ejemplo, su convención de llaves. Esencialmente, es una tirada de dados en cuanto a si alguien realmente tuvo un pensamiento cuidadoso, o si realmente le encantó la forma en que hace las cosas.
Parthian Shot
¿Considerarías un atributo estático constante un GLOBAL_CONSTANT_NAME? No es exactamente global, ya que está dentro del alcance de la clase.
James T.
luego entra property... tal vez es una cuestión de lo que el artículo pretende ser, en lugar de lo que realmente es
joelb
240

David Goodger (en "Code Like a Pythonista" aquí ) describe las recomendaciones de PEP 8 de la siguiente manera:

  • joined_lower para funciones, métodos, atributos, variables

  • joined_lowero ALL_CAPSpara constantes

  • StudlyCaps para clases

  • camelCase solo para cumplir con las convenciones preexistentes

desmontado
fuente
3
+1 ejemplos visuales. Aunque no podía ver dónde PEP8 sugiere joined_lowerpara las constantes , sólo "con todas las letras mayúsculas subrayado que separa las palabras". Curioso también sobre la nueva función de enumeración .
Bob Stein
1
StudlyCaps for classesEs una gran regla universal para las clases en casi todos los idiomas. Entonces, ¿por qué hay algunas clases incorporadas en Python (como las datetime.datetimeque no siguen esta convención?)
Prahlad Yeri
3
@PrahladYeri: Desafortunadamente, unittest.TestCase.assertEqualy los amigos tampoco siguen la convención snake_case. La verdad es que partes de la biblioteca estándar de Python se desarrollaron antes de que las convenciones se hubieran solidificado, y ahora estamos atrapados en ellas.
wchargin
3
CamelCase es confuso porque algunas personas dicen que es "camelCase" (también conocido como "mixedCase") y algunas personas dicen que es "CamelCase" (también conocido como "StudlyCaps"). Por ejemplo, el PEP menciona "CamelCase" mientras que usted menciona "camelCase".
Pro Q
su enlace aquí está muerto, tal vez debería ser reemplazado por algo como david.goodger.org/projects/pycon/2007/idiomatic
Wolf
42

Como admite la Guía de estilo para Python Code ,

Las convenciones de nomenclatura de la biblioteca de Python son un poco desordenadas, por lo que nunca obtendremos esto completamente consistente

Tenga en cuenta que esto se refiere solo a la biblioteca estándar de Python . Si no pueden ser tan consistentes, entonces casi no hay muchas esperanzas de tener una convención generalmente adherida para todo el código Python, ¿verdad?

A partir de eso, y la discusión aquí, se lo deducir que es no un pecado horrible si se tiene usando, por ejemplo de Java o C # 's (clara y bien establecida) las convenciones de nomenclatura para las variables y funciones al cruzar a Python. Teniendo en cuenta, por supuesto, que es mejor cumplir con el estilo predominante para una base de código / proyecto / equipo. Como señala la Guía de estilo de Python, la consistencia interna es lo más importante.

Siéntase libre de despedirme como un hereje. :-) Al igual que el OP, no soy un "Pythonista", todavía no de todos modos.

Jonik
fuente
32

Hay PEP 8 , como muestran otras respuestas, pero PEP 8 es solo la guía de estilo para la biblioteca estándar, y solo se toma como un evangelio. Una de las desviaciones más frecuentes de PEP 8 para otras piezas de código es la denominación de variables, específicamente para los métodos. No existe un estilo único predominante, aunque teniendo en cuenta el volumen de código que utiliza mixedCase, si se hiciera un censo estricto, probablemente terminaría con una versión de PEP 8 con mixedCase. Hay poca otra desviación de PEP 8 que es tan común.

Thomas Wouters
fuente
99
Esto puede haber sido cierto en el '08 cuando esto fue respondido, pero hoy en día casi todas las bibliotecas principales usan convenciones de nomenclatura PEP 8.
Thane Brimhall
29

Como se mencionó, PEP 8 dice que se use lower_case_with_underscorespara variables, métodos y funciones.

Prefiero usar lower_case_with_underscorespara variables y mixedCasepara métodos y funciones hace que el código sea más explícito y legible. Por lo tanto, seguir el zen de Python "explícito es mejor que implícito" y "la legibilidad cuenta"

Claytron
fuente
3
+1 Cambio esos dos (utilizo mixedCase para las variables), pero tener todo más distinto como eso ayuda a que sea inmediatamente obvio lo que está tratando, especialmente porque puede pasar funciones.
Xiong Chiamiov
2
Aunque la "legibilidad" es altamente subjetiva. Encuentro métodos con guiones bajos más legibles.
Pithikos
Su preferencia fue mi intuición inicial proveniente de muchos años de desarrollo de Java. Me gusta usar _ para variables, pero desde el punto de vista, me parece un poco divertido para funciones y métodos.
Michael Szczepaniak
21

Además de lo que ha respondido @JohnTESlade. La guía de estilo de Python de Google tiene algunas recomendaciones bastante buenas,

Nombres a evitar

  • nombres de caracteres únicos, excepto contadores o iteradores
  • guiones (-) en cualquier nombre de paquete / módulo
  • \__double_leading_and_trailing_underscore__ names (reservado por Python)

Convenio de denominación

  • "Interno" significa interno a un módulo o protegido o privado dentro de una clase.
  • Anteponer un solo guión bajo (_) tiene cierto soporte para proteger las variables y funciones del módulo (no incluido con import * from). Anteponer un doble guión bajo (__) a una variable o método de instancia efectivamente sirve para hacer que la variable o método sea privado para su clase (usando el cambio de nombre).
  • Coloque clases relacionadas y funciones de nivel superior juntas en un módulo. A diferencia de Java, no es necesario limitarse a una clase por módulo.
  • Se usa CapWordspara nombres de clase, pero lower_with_under.pypara nombres de módulos. Aunque hay muchos módulos existentes nombrados CapWords.py, esto ahora se desaconseja porque es confuso cuando el módulo recibe el nombre de una clase. ("espera - escribí import StringIOo from StringIO import StringIO?")

Pautas derivadas de las recomendaciones de Guido ingrese la descripción de la imagen aquí

Sufiyan Ghori
fuente
17

La mayoría de las personas de Python prefieren los guiones bajos, pero incluso yo estoy usando Python desde hace más de 5 años en este momento, todavía no me gustan. Me parecen feos, pero tal vez eso es todo el Java en mi cabeza.

Simplemente como CamelCase mejor, ya que se ajusta mejor a la forma en que las clases se nombran, se siente más lógico tener SomeClass.doSomething()que SomeClass.do_something(). Si observa el índice de módulo global en Python, encontrará ambos, lo que se debe al hecho de que es una colección de bibliotecas de varias fuentes que crecieron horas extras y no algo que fue desarrollado por una compañía como Sun con estrictas reglas de codificación. . Yo diría que la conclusión es: usa lo que más te guste, es solo una cuestión de gusto personal.

André
fuente
10
Vengo de un fondo de Java, y encuentro subrayados verbosos y poco atractivos, siendo solo el último una opinión. Nombrar es, en algunos aspectos, un equilibrio entre legibilidad y brevedad. Unix va demasiado lejos, pero su en.wikipedia.org/wiki/Domain-specific_language es limitado. CamelCase es legible debido a las mayúsculas, pero no tiene caracteres adicionales. 2c
Matthew Cornell
2
Para mí, los guiones bajos son atractivos en funciones / métodos ya que veo cada guión bajo como un separador para un espacio de nombres virtual (en mi cabeza). De esa manera puedo saber fácilmente cómo nombrar mis nuevas funciones / métodos: make_xpath_predicate, make_xpath_expr, make_html_header,make_html_footer
Pithikos
3
No (normalmente) llama SomeClass.doSomething()(los métodos estáticos son generalmente raros) generalmente llamaan_instance.do_something()
Dave
15

Personalmente trato de usar CamelCase para clases, métodos y funciones de MixedCase. Las variables suelen estar separadas por un guión bajo (cuando puedo recordar). De esta manera puedo decir de un vistazo a qué estoy llamando exactamente, en lugar de que todo se vea igual.

cristal
fuente
15
El caso de camello comienza con una letra minúscula IIRC como "camelCase".
UnkwnTech
11
Creo que crystallattice lo hizo bien, al menos, su uso es consistente con el uso en PEP8 (CamelCase y mixedCase).
Jarrett
1
@UnkwnTech El término para FirstLetterUpper a veces se llama PascalCase
SurpriseDog
CamelCase o camelCase? sólo me preguntaba.
Sumit Pokhrel
11

Hay un documento sobre esto: http://www.cs.kent.edu/~jmaletic/papers/ICPC2010-CamelCaseUnderScoreClouds.pdf

TL; DR Dice que snake_case es más legible que camelCase. Es por eso que los lenguajes modernos usan (o deberían usar) serpiente donde pueden.

alebian
fuente
99
Curiosamente, también dice: "Los resultados de este estudio podrían no aplicarse necesariamente a los identificadores incrustados en el código fuente. Es completamente posible que los identificadores de camello actúen como un mejor elemento gestalt cuando se incrustan dentro de las construcciones de programación".
rob3c
2

El estilo de codificación suele ser parte de los estándares de política / convención internos de una organización, pero creo que, en general, el estilo all_lower_case_underscore_separator (también llamado snake_case) es más común en python.

fuentesjr
fuente
0

Personalmente uso las convenciones de nomenclatura de Java cuando desarrollo en otros lenguajes de programación, ya que es coherente y fácil de seguir. ¡De esa manera no estoy luchando continuamente sobre qué convenciones usar, que no deberían ser la parte más difícil de mi proyecto!

bradylange
fuente
Estoy un poco de acuerdo. Si el lenguaje X es solo una pequeña cantidad del proyecto, el cambio de contexto de cómo formatear el texto puede ser una carga. El principal inconveniente es que las bibliotecas tendrán llamadas en un estilo ( library_function(my_arg)).
Lan
-2

Por lo general, uno sigue las convenciones utilizadas en la biblioteca estándar del lenguaje.

Yfeldblum
fuente