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

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

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

En Python, he visto lo anterior, pero también he visto el uso de guiones bajos:

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

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

preguntado Oct 01 '08, 19:10

13 Respuestas

Ver Python PEP 8: Nombres de funciones y variables:

Los nombres de las funciones deben ser 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.

caso mixto se permite solo en contextos donde ese ya es el estilo predominante (p. ej. enhebrar.py), para mantener la compatibilidad con versiones anteriores.

Respondido el 20 de junio de 20 a las 10:06

PEP = Propuesta de mejora de Python. - Pedro Mortensen

@RickyRobinson ¿Qué editor de código de muerte cerebral está usando, que no sabe que el subrayado continúa una palabra? Muchos gratuitos que lo hacen. Uso Notepad ++, si no hay un IDE disponible. Para eso, puede descargar una plantilla para la edición de Python. (Otros pueden recomendar descargas gratuitas aún más útiles). Fabricante de herramientasSteve

Un caso para el estilo subrayado es que puede usar mejor las palabras de una letra. Por ejemplo (un poco tonto), findMeAClass es quizás más feo que find_me_a_class. - heltonbiker

Encuentro que la convención de nombres de variables en minúsculas no es adecuada en la informática científica, donde a menudo uno se encuentra con constantes, tensores, etc. bien conocidos que se indican con letras mayúsculas. - andreasdr

@rr PEP8 es una "Guía de estilo" y se describe a sí misma como una Convención, NO como una Norma. También explica claramente las razones por las que no siempre se siguen esas "reglas". - El Tahaan

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

respondido 20 mar '20, 05:03

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 un pensamiento sólido detrás de la guía de Google ... - Mateo Cornell

La mezcla de @MatthewCornell no está mal siempre y cuando te ciñas a ella. En realidad, facilita la legibilidad si sabe que las funciones tienen guiones bajos y las clases no. - Pithikos

@MatthewCornell No asumiría que tiene algo que ver con Python. Go realmente aplica estándares arbitrarios de belleza y no podrá compilar si no se adhiere, por ejemplo, a su convención de llaves. Esencialmente, es una tirada de dados saber si alguien realmente tuvo un pensamiento cuidadoso, o simplemente amaba la forma en que hacen las cosas. - Disparo parto

¿Consideraría un atributo estático constante como GLOBAL_CONSTANT_NAME? No es exactamente global, ya que está en el ámbito de la clase. - James T.

luego entra property ... tal vez se trate de lo que el artículo pretende ser, en lugar de lo que realmente es - joel

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_lower or ALL_CAPS para constantes

  • StudlyCaps para clases

  • camelCase solo para ajustarse a convenciones preexistentes

Respondido el 20 de diciembre de 15 a las 08:12

+1 ejemplos visuales. Aunque no pude ver dónde sugiere PEP8 joined_lower en constante, solo "todas las letras mayúsculas con guiones bajos que separan las palabras". Curioso también por lo nuevo enumerar característica. - bob stein

StudlyCaps for classes es una gran regla universal para las clases en casi todos los idiomas. Entonces, ¿por qué hay algunas clases integradas de Python (como datetime.datetime no sigue esta convención? - prahlad yeri

@PrahladYeri: Desafortunadamente, unittest.TestCase.assertEqual y los amigos tampoco siguen la convención de snake_case. La verdad es que partes de la biblioteca estándar de Python se desarrollaron antes de que las convenciones se solidificaran, y ahora estamos atascados con ellas. - cargando

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 - Lobo

A este tenor, Guía de estilo para código Python admite,

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 Python biblioteca estándar. Si no pueden conseguir esta coherente, entonces apenas hay muchas esperanzas de tener una convención generalmente adherida para todos Código Python, ¿verdad?

De eso, y de la discusión aquí, deduciría que es no un pecado horrible si uno sigue usando, por ejemplo, convenciones de nomenclatura de Java o C # (claras y bien establecidas) para variables y funciones cuando se cruza a Python. Teniendo en cuenta, por supuesto, que es mejor respetar el estilo predominante de una base de código / proyecto / equipo. Como señala la Guía de estilo de Python, consistencia interna lo que mas importa.

Siéntete libre de tacharme de hereje. :-) Como el OP, no soy un "Pythonista", al menos no todavía.

Respondido 13 Jul 16, 23:07

No 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 en ella. 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 hay un solo estilo predominante, aunque considerando el volumen de código que usa mixedCase, si uno 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 sea tan común.

Respondido 01 Oct 08, 22:10

Esto puede haber sido cierto en el '08 cuando se respondió, pero hoy en día casi todas las bibliotecas principales usan convenciones de nomenclatura PEP 8. - Thane Brimhall

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

Yo prefiero usar lower_case_with_underscores para variables y mixedCase para métodos y funciones hace que el código sea más explícito y legible. Por lo tanto, siguiendo el Zen de Python "explícito es mejor que implícito" y "la legibilidad cuenta"

respondido 05 nov., 08:02

+1 Cambio esos dos (uso mixedCase para las variables), pero tener todo más distinto así ayuda a que sea inmediatamente obvio con qué estás lidiando, especialmente porque puedes pasar funciones. - Xiong Chiamiov

Aunque la "legibilidad" es muy subjetiva. Encuentro los métodos con subrayado más legibles. - Pithikos

Su preferencia fue mi intuición inicial proveniente de muchos años de desarrollo de Java. Me gusta usar _ para las variables, pero desde el punto de vista de los ojos, me parece un poco divertido para las funciones y los métodos. - Michael Szczepaniak

más allá de lo que ha respondido @JohnTESlade. Guía de estilo de Python de Google tiene algunas recomendaciones bastante interesantes,

Nombres para evitar

  • nombres de un solo carácter excepto para 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 la importación * desde). Anteponer un guión bajo doble (__) a una variable de instancia o método sirve para hacer que la variable o el método sean privados de su clase (usando la modificación de nombres).
  • Coloque las clases relacionadas y las funciones de nivel superior juntas en un módulo. A diferencia de Java, no es necesario limitarse a una clase por módulo.
  • Utilice la herramienta CapWords para los nombres de las clases, pero lower_with_under.py para los nombres de los módulos. Aunque hay muchos módulos existentes denominados CapWords.py, esto ahora se desaconseja porque es confuso cuando el módulo lleva el nombre de una clase. ("espera - escribí import StringIO or from StringIO import StringIO? ")

Directrices derivadas de las recomendaciones de Guido enter image description here

Respondido 08 ago 18, 23:08

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

Simplemente me gusta más CamelCase ya que encaja mejor con la forma en que se nombran las clases. Se siente más lógico tener SomeClass.doSomething() que SomeClass.do_something(). Si miras a tu alrededor en el índice de módulo global en Python, encontrarás ambos, lo cual se debe al hecho de que es una colección de bibliotecas de varias fuentes que crecieron con el tiempo 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.

Respondido 11 Abr '15, 21:04

Vengo de un entorno de Java, y encuentro subrayados detallados y poco atractivos, y solo el último es opinión. Nombrar es, en algunos aspectos, un equilibrio entre legibilidad y brevedad. Unix va demasiado lejos, pero es en.wikipedia.org/wiki/Domain-specific_language está limitado. CamelCase es legible debido a las mayúsculas, pero no tiene caracteres adicionales. 2c - Mateo Cornell

Para mí, los guiones bajos son atractivos en funciones / métodos, ya que veo cada guión bajo como un separador de 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

No llamas (normalmente) SomeClass.doSomething() (los métodos estáticos son generalmente raros) usualmente llama an_instance.do_something() - David

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

Respondido 02 Oct 08, 04:10

El caso de camello comienza con una letra IIRC en minúscula como "camelCase". - UnkwnTech

Creo que crystalattice tenía razón; al menos, su uso es consistente con el uso en el PEP8 (CamelCase y mixedCase). - Jarrett

@UnkwnTech El término para FirstLetterUpper a veces se llama PascalCase - SorpresaPerro

CamelCase o camelCase? sólo me preguntaba. - Sumit Pojrel

Hay un artículo 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) serpientes siempre que pueden.

Respondido 23 Jul 18, 00:07

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

El estilo de codificación suele ser parte de los estándares internos de política / convención 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.

respondido 04 nov., 15:17

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!

Respondido 22 ago 19, 04:08

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

Por lo general, se siguen las convenciones utilizadas en la biblioteca estándar del idioma.

Respondido 02 Oct 08, 04:10

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.