¿Por qué Python no tiene comentarios multilínea?

252

OK, soy consciente de que las cadenas de comillas triples pueden servir como comentarios de varias líneas. Por ejemplo,

"""Hello, I am a 
   multiline comment"""

y

'''Hello, I am a 
   multiline comment'''

Pero técnicamente hablando, estas son cadenas, ¿correcto?

Busqué en Google y leí la guía de estilo de Python, pero no pude encontrar una respuesta técnica de por qué no hay una implementación formal de comentarios de tipo multilínea, / * * /. No tengo ningún problema con las comillas triples, pero tengo un poco de curiosidad sobre lo que llevó a esta decisión de diseño.

CoolGravatar
fuente
8
Si puede hacerlo como una cadena, ¿por qué agregar más formas?
Brody
12
Solo quería agregar que falla si lo que intenta comentar también tiene comentarios / cadenas de varias líneas. Y eso, por supuesto, es por eso que los necesitamos.
nycynik
50
@ S.Lott Creo que es una pregunta útil. Para entender por qué Python es bueno, es importante comprender las decisiones de diseño que se tomaron (y las decisiones continuas que aún se están tomando). La pregunta no es argumentativa ni combativa; es curioso No hay necesidad de ser tan duro con la curiosidad.
Mark E. Haase
66
Si necesita un comentario de varias líneas para el bacalao, solo if False:el código
AturSams
55
@Brody Porque se procesan las cadenas. Los comentarios son ignorados. Hay problemas con el uso de cadenas como comentarios. Solo mire a su alrededor :)
ADTC

Respuestas:

266

Dudo que obtenga una mejor respuesta que "Guido no sintió la necesidad de comentarios de varias líneas".

Guido ha tuiteado sobre esto:

Consejo de Python: puede usar cadenas de varias líneas como comentarios de varias líneas. ¡A menos que se usen como cadenas de documentos, no generan código! :-)

Ned Batchelder
fuente
28
Vea el tweet de Guido sobre esto.
Petr Viktorin
15
Una desventaja de mezclar cadenas de varias líneas y comentarios de bloque es que IDE no tiene idea de lo que quiere, por lo tanto, no puede mostrar comentarios en un estilo diferente según sea necesario.
Baiyan Huang
21
También hace que sea imposible comentar el código con cadenas de varias líneas (y puede provocar errores de sangría si no tiene cuidado). Ew!
Mike Graham
3
He trabajado en muchos campos en los que si su código contiene código comentado, entonces su código es rechazado e incluso puede ser invitado a actualizar su CV. Elimine el código que no es necesario, no es un problema si el código está bajo control de versiones, o utilícelo if False:antes del código que debe deshabilitarse.
Steve Barnes
44
@SteveBarnes está de acuerdo en que los bloques grandes de código comentado en producción son malos. Pero no entiendo por qué if Falsees mejor. Realiza exactamente lo mismo, aunque es menos claro (ya que no es tan obvio de un vistazo que el bloque de código ha sido desactivado).
59

Los comentarios de varias líneas son fácilmente rompibles. ¿Qué pasa si tiene lo siguiente en un programa de calculadora simple?

operation = ''
print("Pick an operation:  +-*/")
# Get user input here

Intenta comentar eso con un comentario de varias líneas:

/*
operation = ''
print("Pick an operation:  +-*/")
# Get user input here
*/

Vaya, tu cadena contiene el delimitador de comentario final.

Steve Losh
fuente
174
Lo mejor de esta respuesta es cómo se maneja con el resaltador de sintaxis de SO.
Nietzche-jou
73
Esta es una de las muchas razones por las que tenemos caracteres de escape, no lo veo como una buena razón para NO tener soporte para comentarios de varias líneas.
Natalie Adams
34
No entiendo tu lógica, quizás mi comentario no fue lo suficientemente claro. Si usamos \ como carácter de escape: print ("Elija una operación: + - * \ /") "* /" ya no denota un bloque de comentario final ya que literalmente / se imprimirá. Continúe y pruebe esto en C ++. De hecho, el resaltador de sintaxis de SO mostrará que es válido. Este no es un tema complejo, ha existido durante años en otros idiomas. Le pediría que actualice su publicación para incluir el uso de caracteres de escape para mostrar que PUEDE usar "* /" en su código.
Natalie Adams
23
¿Qué pasa si su código contiene '' '. Uy su código contiene el comentario final delimitador
siamii
21
Los comentarios de varias líneas no son inherentemente rompibles; es solo que la mayoría de sus implementaciones son (incluida Python). La forma obvia de hacer comentarios de varias líneas en Python, en mi opinión, es simplemente dejarme iniciar un bloque de comentarios #:y usar sangría para mostrar cuándo finalizó el comentario. Es limpio, consistente y maneja el anidamiento perfectamente.
GatesDA
34

El texto entre comillas triples NO debe considerarse comentarios de varias líneas; por convención, son docstrings . Deben describir lo que hace su código y cómo usarlo, pero no para cosas como comentar bloques de código.

Según Guido, los comentarios multilínea en Python son solo comentarios contiguos de una sola línea (busque "comentarios en bloque").

Para comentar bloques de código, a veces uso el siguiente patrón:

if False:
    # A bunch of code
Tríptico
fuente
66
Parece que Guido cambió de opinión desde entonces.
Petr Viktorin
55
con respecto a la solución "if false:", la cosa es que en Python, ya que funciona con pestañas, tendría que ingresar todo el código debajo de "if False:". Y desabrochar el trozo después. Así que deberías ser bastante ingenioso con tu editor de texto.
barlop
3
si usa un editor decente, debería ser la misma cantidad de tiempo que * /
AturSams
@barlop sí, ¡aprende tus editores! Esto generalmente se puede lograr en menos de un segundo en vim conV}>>
Triptych
30

Esto probablemente se remonta al concepto central de que debería haber una forma obvia de hacer una tarea. Los estilos de comentarios adicionales agregan complicaciones innecesarias y podrían disminuir la legibilidad.

Jarred McCaffrey
fuente
8
Ese es el problema, creo: Usar una cadena como comentario no es obvio y viola el principio de "una forma de hacer una tarea", ya que hay dos formas de hacer comentarios: cadenas y #.
GatesDA
1
Pero no es significativamente diferente de lo que tiene en lenguajes basados ​​en C: / * vs //, por lo que no veo cómo es significativamente peor.
Ben Roberts
//, considera POR QUÉ alguien querría un comentario de varias líneas. Buenas razones: ... Realmente no puedo pensar más allá de "No tengo que escribir tantos de estos # doohickeys" y "Necesito mostrar este comentario en particular de una manera muy precisa, y esa forma precisa no no permita el número anterior ". Digamos que alguien quiere hacer un diagrama ASCII, o poner un código de referencia de JavaScript para copiar y pegar si surge un problema específico. La única forma obvia de hacer una tarea, aquí, no cubre los casos extremos de esa tarea. Sin embargo, estoy de acuerdo en que los estilos de comentarios adicionales son MALOS.
Nathan Basanese
3
"No tengo que escribir tantos de estos # doohickeys". Es precisamente por eso que casi todos los idiomas tienen comentarios de bloque (/ * .. * /). Lo creas o no, pero me gusta documentar lo que hace mi código: las entradas, las salidas, los algoritmos utilizados, los parámetros ... Eso es mucho texto que también se modifica. La restricción a los comentarios de una sola línea es simplemente ridícula. Tenga en cuenta que NO abogo por el enfoque para comentar el código, aunque eso a menudo es útil cuando se intentan enfoques alternativos, siempre que se entiendan los posibles efectos secundarios conocidos.
Albert Godfrind
3
La otra cosa que me molesta de Python es que es esencialmente un lenguaje diseñado por un solo hombre. Cualquier cosa que Guido diga es la verdad ... Entonces, tenemos todas esas extrañas incompatibilidades entre las versiones de idiomas. Por qué ? Porque Guido lo dijo ...
Albert Godfrind
12

Bueno, las comillas triples se usan como comentarios multilínea en cadenas de documentos. Y # comentarios se utilizan como comentarios en línea y la gente se acostumbra a ellos.

La mayoría de los lenguajes de script tampoco tienen comentarios multilínea. Tal vez esa es la causa?

Ver PEP 0008 , sección Comentarios

Y vea si su editor de Python ofrece algunos atajos de teclado para comentarios en bloque. Emacs lo admite, al igual que Eclipse, presumiblemente la mayoría de los IDEs decentes.

Abgan
fuente
9

Del zen de Python :

Debe haber una, y preferiblemente solo una, forma obvia de hacerlo.

Jeremy Cantrell
fuente
5

Personalmente, mi estilo de comentario en Java es como

/*
 * My multi-line comment in Java
 */

Entonces, tener comentarios de una sola línea no es tan malo si su estilo es típico del ejemplo anterior porque en comparación tendría

#
# My multi-line comment in Python
#

VB.NET también es un lenguaje con comentarios de una sola línea, y personalmente me resulta molesto ya que los comentarios terminan pareciendo menos me gusta y más como algún tipo de cita

'
' This is a VB.NET example
'

¿Los comentarios de una sola línea terminan teniendo menos uso de caracteres que los comentarios de varias líneas, y es probable que algunos caracteres dudosos escapen de una declaración de expresiones regulares? Aunque tendería a estar de acuerdo con Ned.

Kezzer
fuente
5

Para comentar un bloque de código en el IDE de Pycharm :

  • Código | Comentario con comentario de línea
  • Windows o Linux: Ctrl+/
  • Mac OS: Command+/
Craig S. Anderson
fuente
4
# This
# is
# a 
# multi-line
# comment

Use el bloque de comentarios o busque y reemplace (s / ^ / # / g) en su editor para lograr esto.

recursivo
fuente
3

Resolví esto descargando una macro para mi editor de texto (TextPad) que me permite resaltar líneas y luego inserta # en la primera de cada línea. Una macro similar elimina los #. Algunos pueden preguntarse por qué es necesaria la multilínea, pero resulta útil cuando intenta "desactivar" un bloque de código con fines de depuración.

kati
fuente
1

Para cualquier otra persona que busque comentarios de varias líneas en Python, usar el formato de triple cita puede tener algunas consecuencias problemáticas, como acabo de aprender por las malas. Considera esto:

this_dict = {
    'name': 'Bob',

"""
This is a multiline comment in the middle of a dictionary
"""

    'species': 'Cat'
}

El comentario de varias líneas se insertará en la siguiente cadena, desordenando la 'species'clave. Es mejor usarlo solo #para comentarios.

Itamar Mushkin
fuente
0

Debido a que la convención # es común, y realmente no hay nada que pueda hacer con un comentario de varias líneas que no pueda hacer con un comentario de # signo. Es un accidente histórico, como la ascendencia de los /* ... */comentarios que se remontan a PL / I,

Charlie Martin
fuente
0

Suponga que simplemente se consideraron innecesarios. Como es tan fácil escribir #a comment, los comentarios de varias líneas pueden consistir en muchos comentarios de una sola línea.

Para HTML , por otro lado, hay más necesidad de multilínea. Es más difícil seguir escribiendo <!--comments like this-->.

Stalepretzel
fuente
44
este no es el punto: existen casos de uso obvios tanto para comentarios de una sola línea como de varias líneas. Los he usado ampliamente en otros idiomas (aunque sé que los puristas de python no se preocupan por otros idiomas). ;)
johndodo
1
intente hacer esto con 200 líneas de código, que debe sacar, volver a colocar y luego volver a sacar. Escribir 200 # iniciales se hace viejo muy rápido.
DragonLord
0

Esto es solo una suposición ... pero

Debido a que son cadenas, tienen un valor semántico (el compilador no las elimina), por lo tanto, tiene sentido que se usen como cadenas de documentos. De hecho, se convierten en parte de la AST , por lo que la extracción de documentación se vuelve más fácil.

Hasen
fuente
0

Además, los comentarios multilínea son una perra . Lamento decirlo, pero independientemente del idioma, no los uso para nada más que para propósitos de depuración. Digamos que tiene un código como este:

void someFunction()
{
    Something
    /*Some comments*/
    Something else
}

Luego, descubre que hay algo en su código que no puede solucionar con el depurador, por lo que comienza a depurarlo manualmente comentando trozos de código cada vez más pequeños con estos comentarios multilínea. Esto le daría la función:

void someFunction()
{ /*
    Something
   /* Comments */
   Something more*/
}

Esto es realmente irritante.

martiert
fuente
3
uh genial, pero Python no tiene /*comentarios de estilo.
Tríptico
17
Correcto, dado que Python no tiene comentarios multilínea reales, fue un poco difícil dar ejemplos en Python.
martiert
2
Yo personalmente no entiendo el problema. Simplemente elimine el extra * /. O use // para comentar líneas simples si necesita ser preciso.
Natalie Adams
44
Hay varios idiomas (muchos de ellos funcionales por cualquier razón) que permiten comentarios anidados. Busque "anidado" en rosettacode.org/wiki/Comments para ver ejemplos.
Keith
1
bueno, sí, sería irritante poner un comentario de varias líneas en un comentario de varias líneas. Y aunque solo recuerdo un poco de mi programa a la vez, al menos recuerdo qué parte de mi programa estoy viendo y qué he comentado. Pero si ni siquiera puede recordar eso, puede usar el hecho de que algunos IDEs ponen en cursiva lo que es un comentario. De todos modos, obviamente, para una función tan pequeña, también puede usar comentarios de una sola línea. Pero si está comentando una gran parte del programa, realmente necesita un comentario de varias líneas. o un editor de texto con esa característica.
barlop
0

Comentarios multilínea usando IDLE en:

  • Mac OS X , después de seleccionar el código, comenta un bloque de código con Ctrl+ 3y descomenta usando Ctrl+ 4.

  • Windows , después de la selección del código, comenta un bloque de código con Ctrl+ Alt+ 3y descomenta usando Ctrl+ At+ 4.

Jorgesys
fuente
-1

Recuerdo haber leído sobre un tipo que pondría sus comentarios de varias líneas en una variable de triple cita:

x = '''
This is my
super-long mega-comment.
Wow there are a lot of lines
going on here!
'''

Esto ocupa un poco de memoria, pero le brinda la funcionalidad de comentarios de varias líneas, y además la mayoría de los editores resaltarán la sintaxis para usted :)

También es fácil comentar el código simplemente envolviéndolo con

x = '''

y

'''
turvyc
fuente
18
elimine el x =y no ocupa memoria.
Endolith