Contenido del capítulo

En este capítulo vas a ver una parte importante de todo software: la documentación.
La documentación puede dar para hacer un curso aparte, como otros temas tratados en este mismo curso. Por ello, no voy a profundizar en muchos aspectos; lo que vas a ver aquí es una introducción a ella.

En otra ocasión, haré un curso dedicado a ella.

Tu ayuda es imprescindible

Has llegado al capítulo final del curso. ¡Felicidades por todo tu esfuerzo y dedicación! Espero que hayas aprendido mucho y que las habilidades adquiridas te sean útiles en tu carrera de desarrollo. Si disfrutaste el contenido y te gustaría apoyar el proyecto, considera realizar una donación para que pueda seguir creando más recursos educativos gratuitos para todos. ¡Gracias por acompañarme en este maravilloso camino!

Duración estimada de todo el contenido:
Duración del vídeo:
No contiene ejercicios Contiene 1 vídeo.
Tabla de contenidos
Logo

    La importancia de la documentación

    En programación, el orden y la claridad, son dos de las partes fundamentales. Sin ellas, todo lo que hagas, será muy difícil de entender y mantener.

    Introducción a la documentación con Python
    Introducción a la documentación con Python

    Imagina una biblioteca de Python, que no tenga documentación en absoluto, ni tutoriales. Solo el código.

    Esto hará que tengas que utilizar otra biblioteca, en su lugar, o bien, que estés horas o días investigando como utilizar cada cosa.

    Si tienes una documentación a mano, puedes consultar de forma rápida, todo lo que puedes hacer y como lo puedes hacer, errores y malas prácticas que se pueden evitar, etc.

    No necesariamente hace falta que te la aprendas de arriba a abajo. Siempre la tendrás a mano para ir consultándola.

    Diferencia entre comentar y documentar

    Si bien podemos decir que cuando estamos comentando, también estamos documentando en cierto modo, hay que distinguir bien cada cosa. Los comentarios son pequeñas anotaciones en el código fuente, que son ignorados por el intérprete de Python.

    Estas anotaciones sirven para dar una ayuda rápida de cosas sencillas. Normalmente, antes de ir a consultar la referencia de la documentación.

    En cambio, la documentación es una descripción detallada del software. Puede llevar mucha información de gran utilidad. Cosas como requisitos, como está diseñado, como utilizar cada una de sus herramientas, etc.

    Ambas cosas deben utilizarse para proporcionar toda la información posible, y por supuesto, que sea útil. Más información en esta caso, no es necesariamente es mejor.

    Los comentarios

    Los comentarios en Python se crean con el caracter #.

    Estos comentarios ocupan una sola línea.

    Para respetar la convención PEP 8 de Python, estos no deberían ocupar más de 72 caracteres de longitud. Si necesitas más, añade otro comentario debajo, o plantéate si realmente te tienes que extender tanto.

    Aquí tienes un ejemplo de comentario de una línea:

    # Multiplica con dos números
    def multiplicar(a, b):
        return a * b

    Propósitos de los comentarios

    Los comentarios pueden tener varios propósitos, a continuación, tienes algunos:

    Describir el código

    Los comentarios son muy útiles para describir cosas de manera simple en el código. Por ejemplo:

    # Esta función devuelve un resultado aleatorio

    Planificación

    También pueden servir para planificar los pasos en la creación de algo:

    # Paso 1: Solicitar al usuario un número
    
    # Paso 2: Convertir el número a un número entero
    
    # Paso 3: Comprobar si el número es par o impar

    Etiquetado

    Quizás hayas visto, en muchas ocasiones, palabras en comentarios; palabras como TODO.

    Estas etiquetas se pueden utilizar en los comentarios para explicar el código, marcar errores, tareas pendientes, etc. Son palabras que funcionan como convención, no son palabras clave ni nada parecido.

    Algunas de las palabras que encontrarás, son estas (entre paréntesis las tienes traducidas al español):

    BUG (FALLO)

    Indica un error en el código que hay que revisar.

    Ejemplo de uso:

    # BUG: Este bucle genera mal los resultados cuando se usan valores negativos.
    for i in range(maximo):

    FIXME Fix me (ARRÉGLAME)

    Áreas de código problemático, errores, código mal hecho, etc. Normalmente, no implican errores como los de BUG. Más bien sirven para indicar cosas que hay que mejorar.

    Ejemplo de uso:

    # FIXME: La función es ineficiente, probar con una generadora
    def procesar_valores(valores):
    TODO To do (PARA HACER)

    Indica una tarea que aún no se ha completado o llevado a cabo. Se utiliza mucho para indicar cosas que hay que hacer en el futuro.

    Ejemplo de uso:

    # TODO: Implementar la función 'calcular_impuestos()'
    

    NOTE (NOTA)

    Indica una nota o comentario adicional.

    Ejemplo de uso:

    # NOTE: Mejora el rendimiento general. Manipular con cautela.
    def procesador():
    

    Estas etiquetas se utilizan mucho con los nombres de integrantes del equipo. Así, indicamos si el comentario va para alguien en concreto.

    Por ejemplo:

    # BUG(Ana): La función produce un fallo aleatorio.

    Con esto, le indicamos a Ana, que hemos encontrado un fallo que tiene que encargarse de revisar.

    Comentarios con operador flecha

    Desde la versión 3.5 (septiembre 2015) de Python, hay una forma explícita de mostrar un comentario especial, que indique el tipo de dato de retorno.

    Realmente, no es un comentario estrictamente hablando, pero cumple su función.

    Se trata del operador flecha o indicador de tipo de retorno (->).

    Gracias a este operador, podremos prescindir de comentarios como este:

    # Acepta un str y devuelve un int
    def longitud(cadena):
        return len(cadena)

    En su lugar, podemos escribir esto:

    def longitud(cadena: str) -> int:
        return len(cadena)

    Con dos puntos podemos indicar el tipo de dato de los parámetros, y con el operador flecha, indicaremos explícitamente el valor de retorno de la función.

    Esto es solo informativo, la función hará lo mismo en ambos casos, pero ya de antemano, sabemos que se espera que se le pase al parámetro cadena, un tipo de dato str, y que su return, devuelve un tipo de dato int.

    def longitud(cadena: str) -> int:
        return len(cadena)
    
    print(type(longitud("Hola")))
    Resultado en la consola
    <class 'int'>

    Estos tipos de datos expresados explícitamente, no implican que se cree una obligación para pasar esos mismos.

    Por ejemplo, en el lenguaje de programación Java, al crear los parámetros, indicamos los tipos de datos que van a llevar.

    Si no les pasamos estos mismos tipos de datos en la llamada, recibimos un error. En Python, esto no ocurre, es mera información para quien desarrolla.

    Parámetros con diferentes tipos de datos

    Habrá veces en las que necesitemos pasar diferentes tipos de datos a un mismo parámetro. Entonces en estos casos, ¿cómo lo hacemos? La respuesta está en utilizar el tipo de dato object. Acuérdate de la superclase de todas las clases.

    Aquí tienes un ejemplo:

    def longitud(valor: object) -> float:
        pass

    También, ambos valores de entrada y salida pueden ser object:

    def longitud(valor: object) -> object:
        pass

    Si tienes varios argumentos, puedes indicar el tipo de cada uno:

    def longitud(par1: object, par2: int, par3: float) -> float:
        pass

    La función print()

    La función print() de Python es un buen ejemplo para mostrar como se utilizan estos comentarios en código “real”.

    def print(
        *values: object,
        sep: str | None = " ",
        end: str | None = "\n",
        file: SupportsWrite[str] | None = None,
        flush: Literal[False] = False,
    ) -> None:

    El primer parámetro es el que espera con *args, que pasemos argumentos posicionales arbitrarios (un número indefinido de ellos).

    ¿De qué tipo son los argumentos para *values? Esta claro, lleva el comodín de todos los objetos con object, puesto que puedes pasarle valores de cualquier tipo.

    Los parámetros sep y end explícitamente indican que van a tener valores str.

    Lo que devuelve la función print() es un valor None. Eso nos lo indica el operador flecha.

    Simplemente, imprime un print() con otro print(), y lo verás:

    print(print())
    Resultado en la consola
    None

    Entonces, esto ya te da una pista de que poner cuando crees una función que no tenga return, que solo tenga print().

    Aquí tienes un ejemplo:

    def suma_decimales(a: float, b: float) -> None:
        print(a + b)
    
    suma_decimales(10.5, 20.4)
    Resultado en la consola
    30.9

    Puede ser que este None te confunda, ya que en la consola estás viendo un float. Sin embargo, este float lo imprime el print(), no lo devuelve la llamada.

    Mira lo que devuelve realmente:

    def suma_decimales(a: float, b: float) -> None:
        print(a + b)
    
    print(suma_decimales(10.5, 20.4))
    Resultado en la consola
    30.9
    None

    Un print() devuelve siempre un None. Otra cosa es lo que imprime, pero eso no es lo que hay que poner en la parte de retorno con el operador flecha.

    Mira otra forma de comprobarlo:

    def suma_decimales(a: float, b: float) -> None:
        print(a + b)
    
    suma = suma_decimales(10.5, 20.4)
    
    print(type(suma))
    Resultado en la consola
    30.9
    <class 'NoneType'>

    Ahora, reemplazamos el print() por return:

    def suma_decimales(a: float, b: float) -> float:
        return a + b
    
    suma = suma_decimales(10.5, 20.4)
    print(type(suma))
    Resultado en la consola
    <class 'float'>

    Docstrings

    Python también tiene la posibilidad de utilizar cadenas de caracteres literales como comentarios.

    Estos se conocen muy a menudo como comentarios multilínea. La sintaxis es la siguiente:

    """
    Comentario
    de varias
    líneas.
    """

    Estos pueden servir para comentarios algo más largos que los de una línea y documentar módulos, clases, métodos, funciones, etc.

    No obstante, también se pueden utilizar como comentarios de una línea:

    """Una línea"""

    A estos comentarios los llamamos docstrings.

    El término docstring es una conjunción de dos palabras: doc(umentation)-string, que podemos traducir al español como cadena de caracteres de documentación.

    La función predefinida help()

    Si ya la conocías, ¿te has preguntado alguna vez de donde sale la información que obtenemos con la función predefinida help()?

    Abre el intérprete interactivo de Python.

    Si tienes las variables de entorno configuradas correctamente, solo tendrás que abrir la consola, y escribir el siguiente comando:

    python

    Esto abrirá el intérprete interactivo:

    Resultado en la consola
    E:\Cursos\Python>python          
    Python 3.12.1 (tags/v3.12.1:2305ca5, Dec  7 2023, 22:03:25) [MSC v.1937 64 bit (AMD64)] on win32
    Type "help", "copyright", "credits" or "license" for more information.
    >>>

    En este caso, consultemos la ayuda de int:

    Resultado en la consola
    >>> help(int) 
    Help on class int in module builtins:
    
    class int(object)
     |  int([x]) -> integer
     |  int(x, base=10) -> integer
    
    . . . Resto de las explicaciones . . .

    Parte de esta ayuda de documentación, la puedes acceder desde la hoja de código, con el atributo especial __doc__.

    Especifica un objeto y utiliza el atributo __doc__:

    print(int.__doc__)

    A donde quiero llegar, es que con las docstrings, podrás documentar elementos de tu código, y que queden incluidos en los atributos __doc__ de los objetos. De esa forma, crearás objetos documentados.

    Aquí tienes un ejemplo:

    def par_impar(numero):
        """
        Solicita un número al usuario con input().
        Lo transforma a tipo int.
        Indica en la consola si el número es par o impar.
        """
        numero = int(numero)
        if numero % 2 == 0:
            print("El número es par.")
        else:
            print("El número es impar.")
    
    par_impar(7)
    Resultado en la consola
    El número es impar.

    Ten en cuenta que la docstring, debe respetar las indentaciones como el resto de elementos.

    Ahora, vamos a imprimir la docstring en la consola:

    print(par_impar.__doc__)
    Resultado en la consola
    Solicita un número al usuario con input().
    Lo transforma a tipo int.
    Indica en la consola si el número es par o impar.

    También, puedes acceder al docstring utilizando la función predefinida help():

    help(par_impar)
    Resultado en la consola
    help on function par_impar in module __main__:
    
    par_impar(numero)
        Solicita un número al usuario con input().
        Lo transforma a tipo int.
        Indica en la consola si el número es par o impar.

    Los tipos de docstring

    Encontrarás diversos tipos de docstrings. Algunas de ellas, son las de clase, las de método, las de función, las de paquete, las de módulo, etc.

    En Visual Studio Code, la extensión Pylint te informa de las diferentes docstrings que tienes que especificar a medida que escribes código.

    En la siguiente imagen puedes verlo:

    Docstrings Python

    Missing {type of element} docstring significa en español “falta {tipo de elemento} la cadena de documentación.”

    La extensión Pylint no se actualiza en tiempo real, tienes que guardar cambios para que se actualicen los avisos.

    Las docstrings, las iremos colocando al principio de cada elemento.

    Aquí tienes un ejemplo:

    """ docstring del módulo """
    
    class Clase:
        """ docstring de la clase """
        def metodo(self):
            """ docstring del método """
    
    def funcion():
        """ docstring de la función """

    Una vez incluyes una docstring en un elemento con bloque de código, no es necesario que incluyas la palabra reservada pass para evitar errores al ejecutar con bloques “vacíos”.

    Las docstrings, a diferencia de los comentarios de una línea, deben indentarse correctamente, de la misma forma que si fuesen otro elemento más en el código:

    print("hola")
    
        """Docstring mal indentada"""
    Error en la consola
    IndentationError: unexpected indent
    Error de indentación: indentación inesperada

    Espacio publicitario






    Espacio publicitario