Title: ¿Cuál es la diferencia entre usar triple comillas dobles (""") y almohadilla (#) para comentar en Python?
Tags: python;python-3.x
Question: Actualmente me encuentro aprendiendo Python, anteriormente me encontraba con Java y los comentarios no eran nada más que como muestra a continuación:

```    //Para una sola línea de código en Java
```



```    /* Para poder realizar un comentario
       en varias líneas en Java*/
```

Hace un tiempo utilicé ```Python``` para desarrollar un examen, creé un sistema web  (siguiendo tutoriales) con ayuda de ```Django```, dentro de las hojas de trabajo aparecían comentarios con 3 comillas dobles (```"""```), como muestra a continuación:

```    """
    Django settings for libreria project.
    Generated by 'django-admin startproject' using Django 2.1.2.
    For more information on this file, see
    https://docs.djangoproject.com/en/2.1/topics/settings/
    For the full list of settings and their values, see
    https://docs.djangoproject.com/en/2.1/ref/settings/
    """
```

```
  Lo anterior lo he sacado directamente desde un archivo de mi sistema
```

Y por otro lado:

```#Para un comentario de una sola línea en `Python`
```

Ahora me encuentro con que para realizar un comentario en varias líneas
es :

```#Para poder realizar un comentario
#de varias líneas, al colocar una almohadilla
#al final de la frase el IDE genera la almohadilla 
#izquierda automáticamente# 
```

Donde sólo se utilizan almohadillas para los comentarios, ya sean de una sola línea o más.



Entonces:


¿Tanto triple comillas dobles y almohadillas sirven para comentarios de varias líneas?
¿Existe alguna diferencia entre utilizar uno u otro al momento de comentar dentro del código?
¿Existen reglas para utilizar uno u el otro (depende de algo?)?



Here is the accepted answer: Los comentarios, estrictamente hablando, se realizan con la almohadilla exclusivamente.


Pueden ser comentarios de bloque:

```# Esto es un comentario de bloque en Python
# que hace uso de varias lineas.
#
# Esto es otro párrafo del comentario de bloque
if foo == 8:
    pass 
```

Por convención siguen las siguientes normas:


Se aplican a parte o todo el código que le siguen (bloque).
Están indentados al mismo nivel que el código que comentan.
Cada línea de un comentario en bloque comienza con un # y un espacio.
Los párrafos dentro de un comentario en bloque se separan con una linea que contiene solo un ```#``` 

Comentarios de linea:

```foo = 4  # Soy un comentario inline
```

Por convención:


Se definen en la misma línea que una sentencia que comenta.
Deben estar separados por al menos dos espacios de la sentencia que comentan.
Deben empezar con un ```#``` seguido de un espacio.





Las comillas triples (tanto dobles ```"""``` como simples ```'''``` ) son una forma de crear literales de cadena que además pueden ser multilínea:

```cad = """Soy una cadena
con varias
líneas
"""

print(cad)
```

```
```Soy una cadena
con varias
líneas
```
```

También podemos crear literales de cadena con solo una comilla doble y simple en Python:

```cad = "Hola"
cad = 'Hola'
```

No hay diferencia alguna entre ambas formas, pero si se usa una para especificar el literal, la otra puede usarse dentro del literal sin necesidad de escapar:

```cad = "Hola tiene una 'h' y una 'l'"
```

Aunque es común ver "comentarios" en código Python usando literales definidos con comillas triples sin asignar a ninguna variable, no son verdaderos comentarios. Lo que si es cierto es que el intérprete (no interactivo) ignora dichas líneas (sin asignación) a la hora de generar el bytecode e interpretarlo, por lo que se convierten virtualmente en comentarios, sin serlo realmente y sin ser la forma correcta de hacerlo.

Hay una excepción a tener en cuenta, si este literal es declarado en la primera linea tras definir una función, método o clase tienen funcionalidad especial, son lo que se conocen como docstring o cadenas de documentación. Son cadenas que sirven como documentación y guía de uso para ese objeto.  Las convenciones para las cadenas de documentación están definidas en PEP 257.

Resumiendo:


La primera linea debe ser un resumen breve del propósito del objeto, no debe indicar explícitamente el nombre o tipo del objeto y siempre  debe comenzar con una letra mayúscula y terminar con un punto.
Si solo existe la linea anterior no se debe agregar espacios antes ni después de ella. Las comillas deben cerrarse en la misma linea.
No debe ser la firma de la función, esto se consigue por introspección y sería redundante. Solo debe especificarse la firma de la función si está creada en C/C++  (C/C++ API), dónde la introspección no llega.
Si hay más líneas la segunda línea debe estar en blanco, separando visualmente el resumen del resto de la descripción.
Las lineas extra se facilita información sobre las convenciones de llamada del objeto, sus efectos secundarios, retorno, etc
Cuando hay más de una linea la triple comilla de cierre debe estar sola en la linea final, preferiblemente precedida de una línea en blanco.
Aunque se puede usar un literal de cadena declarado con comillas simples o dobles, por convención (y porque suele ser más de una linea) se usan comillas triples aunque sean de una sola línea.




```def sin(x: float, unidad: str = "radian") -&gt; float:
    """Retorna el seno de x (en radianes).

    Argumentos keywords:
    unidad -- radian o grado (radian por defecto)

    """
    pass

def sqrt(x: float) -&gt; float:
    """Retorna la raiz cuadrada de x."""
    pass
```

Esta cadena (además de ayudar a entender el código por los humanos que lo lean) puede ser accedida mediante el atributo especial ```__doc__``` del objeto y este método podrá ser usado por el buitin ```help```, usado cuando se especifica el argumento ```-h```/```--help``` al invocar un script en la terminal, por los propios entornos de desarrollo y editores de código para mostrar la ayuda emergente a la vez que se escribe código y en general por cualquier otro generador o parser de documentación:

```
```&gt;&gt;&gt; help(sin)

Help on function sin in module __main__:

sin(x: float, unidad: str = 'radian') -&gt; float
    Retorna el seno de x (en radianes).

    Argumentos keywords:
    unidad -- radian o grado (radian por defecto)
```
```

Todos los paquetes, scripts, módulos, métodos, clases y funciones de uso público debería tener definido su docstring. No son necesarios en los métodos no públicos, pero no está de más tener un comentario que describa lo que hacen.



Para terminar de aclarar, por si alguien llegado a este punto se pregunta porqué Django usa las triples comillas para comentarios... El ejemplo que pones no es un comentario, es de hecho el docstring para los módulos que genera automáticamente Django. En este caso concreto es el docstring por defecto para ```settings.py```, igualmente que para las funciones, métodos, etc los parseadores de documentación hacen uso del mismo, entre ellos ```help```, el argumento ```-h```/```--help``` en linea de comandos, etc:

```
```&gt;&gt;&gt; import settings
&gt;&gt;&gt; help(settings)

Help on module settings:

NAME
    settings - Django settings for ExampleApp project.

DESCRIPTION
    Generated by 'django-admin startproject' using Django 1.9.6.

    For more information on this file, see
    https://docs.djangoproject.com/en/1.9/topics/settings/

    For the full list of settings and their values, see
    https://docs.djangoproject.com/en/1.9/ref/settings/

DATA
    ALLOWED_HOSTS = []
    AUTH_PASSWORD_VALIDATORS = [{'NAME': 'django.contrib.auth.password_val...
    ....
```
```

Comment for this answer: Muchas gracias!, excelente explicación, no sabía lo de docstring, esto se puede ocupar las funciones o clases, esto es similar a la información que otogan los ids al momento de ocupar un método o función?
Comment for this answer: Las cadenas de documentación se pueden definir en clases, funciones/métodos, módulos, scripts (modulo ejecutable) y paquetes. Y si, efectivamente, los entornos de desarrollo y editores usan los docstring (ademas de hacer uso de introspección, type hints, etc dependiendo del IDE) para mostrar información de ayuda, si colocas las dos funciones ejemplo que pongo arriba en un editor como vscode con la extensión Python instalada al momento de escribir `sin(` mostrará la información del docsting.
Comment for this answer: Lo acabo de comprobar y he quedado loca! hahah esto es bastante útil al momento de querer usar funciones creadas por uno mismo, y pensé que la pregunta era algo estúpida, he encontrado información realmente valiosa! muchas gracias por tu tiempo escribiendo tan excelente respuesta! muchas gracias :)


{'source': 'StackExchangeDataset', 'subset': 'es.stackoverflow.com', 'metadata': {'AnswerCount': 1, 'CommentCount': 0, 'ContentLicense': 'CC BY-SA 4.0', 'CreationDate': '2019:00:07/25/19', 'FavoriteCount': None, 'PostTypeId': 1, 'Tags': '<python><python-3.x>', 'Title': '¿Cuál es la diferencia entre usar triple comillas dobles (""") y almohadilla (#) para comentar en Python?', 'ViewCount': 6211, 'id': 281455, 'user_AboutMe': '<h1>Hi  Jocelyn Gutiérrez here!</h1>\n<h2>Software Developer</h2>\n<p>Ingeniera en Informática de Duoc UC, con un año de experiencia en el desarrollo de aplicaciones de escritorio y servicios Web, gracias a diversos lenguajes y tecnologías, así como Java, Python, C#, PHP, Javascript, Cobol entre otros. Me gusta trabajar en equipo, constantemente buscando mejorar mi calidad de trabajo, automatizando tareas del día a día.</p>\n<h3>Skills</h3>\n\n<img src="https://raw.githubusercontent.com/danielcranney/readme-generator/main/public/icons/skills/csharp-colored.svg" width="36" height="36" alt="C#" />\n<img src="https://raw.githubusercontent.com/danielcranney/readme-generator/main/public/icons/skills/java-colored.svg" width="36" height="36" alt="Java" />\n<img src="https://raw.githubusercontent.com/danielcranney/readme-generator/main/public/icons/skills/javascript-colored.svg" width="36" height="36" alt="Javascript" />\n<img src="https://raw.githubusercontent.com/danielcranney/readme-generator/main/public/icons/skills/python-colored.svg" width="36" height="36" alt="Python" />\n<img src="https://raw.githubusercontent.com/danielcranney/readme-generator/main/public/icons/skills/html5-colored.svg" width="36" height="36" alt="HTML5" />\n<img src="https://raw.githubusercontent.com/danielcranney/readme-generator/main/public/icons/skills/react-colored.svg" width="36" height="36" alt="React" />\n<img src="https://raw.githubusercontent.com/danielcranney/readme-generator/main/public/icons/skills/oracle-colored.svg" width="36" height="36" alt="Oracle" />\n<img src="https://raw.githubusercontent.com/danielcranney/readme-generator/main/public/icons/skills/mysql-colored.svg" width="36" height="36" alt="MySQL" />\n<img src="https://raw.githubusercontent.com/danielcranney/readme-generator/main/public/icons/skills/dot-net-colored.svg" width="36" height="36" alt=".NET" />\n<img src="https://raw.githubusercontent.com/danielcranney/readme-generator/main/public/icons/skills/django-colored.svg" width="36" height="36" alt="Django" />\n</p>\n', 'user_AccountId': 14862199.0, 'user_DisplayName': 'Riaven', 'user_Reputation': 3389.0, 'user_Views': 587.0, 'user_id': 109169.0}}