Introducción.
Si has creado un proyecto realmente útil y quiere compartirlo con otra gente, un paso crucial es crear la documentación que ayude a los usuarios a entender que es lo que hace el código, como funciona y como poder usarlo.
Para compartir el código que hayas creado y ayudar a la gente a usarlo, crearemos un sitio web que contenga la documentación de tu proyecto.
Que haremos.
Esta guía te enseñará como construir un sitio web para tu proyecto que automáticamente cree la documentación par tu código Python.
Que aprenderás.
- Como documentar el código de Python
- Como automáticamente generar la documentación.
- Como usar el reStructuredText markup language.
- Como crear un proyecto web usando Sphinx.
Empecemos.
from random import shuffle class Carta: def __init__(self, palo, numero): self._palo = palo self._numero = numero # getter y setter para el atributo palo @property def palo(self): return self._palo @palo.setter def palo(self, palo): if palo in ["oros", "copas", "espadas", "bastos"]: self._palo = palo else: print("¡Ese no es un palo de la baraja!") # getter y setter para el atributo numero @property def numero(self): return self._numero @numero.setter def numero(self, numero): if isinstance(numero, int): if numero in [1,2,3,4,5,6,7,10,11,12]: self._numero = numero else: print("El número de la carta debe estar entre 1 y 12") print("Excluyendo el 8 y el 9") else: print("El valor introducido debe ser númerico") def esta_en_mazo(self, mazo): """Comprueba si una determinada carta esta en el mazo que le pasamos o no""" for carta in mazo: if self.palo == carta.palo: if self.numero == carta.numero: return True return False def __repr__(self): return str(self.numero) + " de " + self._palo class Mazo: def __init__(self): self._cartas = [] self.rellenar() # Creamos un getter @property def cartas(self): return self._cartas def rellenar(self): palos = ["oros", "copas", "espadas", "bastos"] numeros = [1,2,3,4,5,6,7,10,11,12] # Devuelve un mazo con las cartas en orden aleatorio. cartas = [Carta(p, n) for p in palos for n in numeros] shuffle(cartas) self._cartas = cartas def repartir(self, jugadores): manos = {jugador: Mano(jugador) for jugador in jugadores} for _ in range(3): # Repartir 3 cartas a cada jugador for jugador in jugadores: carta = self._cartas.pop() manos[jugador].recibir_carta(carta) for mano in manos.values(): mano.mostrar_mano() class Mano: def __init__(self, jugador): self.jugador = jugador self.cartas = [] def recibir_carta(self, carta): self.cartas.append(carta) def mostrar_mano(self): print(f"Mano de {self.jugador}:") for carta in self.cartas: print(carta) mi_mazo = Mazo() jugadores = ["Jugador 1", "Jugador 2"] mi_mazo.repartir(jugadores)
>>> %Run carta.py
Mano de Jugador 1:
7 de copas
11 de copas
7 de espadas
Mano de Jugador 2:
11 de bastos
11 de espadas
1 de copas
Documentando el código.
def holamundo():
""" imprime 'hola mundo' en la pantalla """
print("hola mundo")
def holamundo():
"""
Esta función imprime "hola mundo" en la pantalla.
No acepta argumentos, ni devuelve nada.
"""
print("hola mundo")
class Carta:
"""
La clase carta representa una única carta y se
inicializa pasándole el palo y número de la carta a
representar.
"""
def __init__(self, palo, numero):
self._palo = palo
self._numero = numero
Añade tú una posible cadena de documentación para las otras clases.
Generando la documentación.
Ahora que tu código contiene algo de información sobre si mismo en los formularios de los docstring, puedes usar el módulo de Python pydoc, para que automáticamente se cree un documento HTML con la documentación del código.
Abre una ventana de terminal (Raspberry Pi/Linux PC/Mac) o una ventana de comandos de Windows (Windows PC).
Navega hasta el directorio que contiene el programa carta.py
.
cd nombre_del_directorio
Introduce el comando para que el módulo pydoc
cree la documentación.
WINDOWS.
Cuando el comando ha terminado de ejecutarse, saldrá el mensaje ‘wrote carta.html’. Date cuenta que pydoc
usa el nombre del programa de Python como nombre para el archivo HTML.
Abre el archivo carta.html usando tu navegador para ver la documentación que se ha creado.
Verás una página que muestra las clases Carta, Mano y Mazo. Para sus métodos y propiedades, incluyendo la documentación que has añadido como cadenas de documentación.
Puedes utilizar esta página HTML sencilla en un servidor Web para proporcionar a tus usuarios información sobre tu código. En los siguientes pasos veremos como usar la herramienta Sphinx para crear un sitio web de documentación al que puedas añadir contenido e información adicional.
Creando un proyecto web con Sphinx.
Usar pydoc y docstrings es una excelente manera de crear documentación estructurada sobre tu código, pero tiene limitaciones porque no puedes agregar información adicional y contenido.
En un sitio web menos básico, similar al de GPIO Zero, por ejemplo, puedes agregar mucha más información además de la documentación, preguntas frecuentes, imágenes y fragmentos de código.
Usaremos Sphinx para crear un proyecto de sitio web de este tipo. Esta herramienta fue creada originalmente para documentar el lenguaje Python.
Para crear contenido para tu sitio web con Sphinx, escribirás archivos de texto formateados utilizando el lenguaje de marcado simple pero potente reStructuredText (ReST).
Instalar Sphinx.
Usa pip3 para instalar este módulo, por ejemplo:
pip3 install sphinx
Crea un proyecto con Sphinx.
- Navega al directorio de tu proyecto.
- Ejecuta el siguiente comando:
index.rst - La página principal e índice de tu documentación.
Construyendo la página Web.
Añadiendo la documentación del código.
# Configuration file for the Sphinx documentation builder. # # For the full list of built-in configuration values, see the documentation: # https://www.sphinx-doc.org/en/master/usage/configuration.html # -- Project information ----------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information import os import sys sys.path.insert(0, os.path.abspath('.')) # -- General configuration --------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration extensions = ['sphinx.ext.autodoc']
Añade también el siguiente código para importar el módulo carta.py
Documentación del Código
=========================
.. module:: carta
.. autoclass:: Carta
:members:
.. autoclass:: Mano
:members:
.. autoclass:: Mazo
:members:
¡Bienvenido a la documentación de carta!
==========================================
.. toctree::
:maxdepth: 2
:caption: Contents:
code
Creando páginas.
Información: URLs in ReST La estructura de una URL en lenguaje markup es muy específica en ReST. El texto del link y el enlace mismo necesitan estar entre dos guiones simples, el segundo de los cuales tiene que estar seguido por un guion bajo, de esta forma: 'texto_del_link <url>'_ Es importante dejar un espacion en blanco entre el texto del link y su enlace. Este tipo de marcado se denomina en línea porque está dentro del texto. También puede crear definiciones de URL independientes y luego hacer referencia a ellas en cualquier parte del texto; esto es útil si desea vincular a la misma URL dos veces.Por favor 'raspberry pi'_. .. _raspberry pi: https://raspberrypi.org/
¡Bienvenido a la documentación de carta!
==========================================
.. toctree::
:maxdepth: 2
:caption: Contents:
code
acerca_de
Reconstruye el proyecto de nuevo con la instrucción:
make html
Como reto personal puedes añadir nuevas páginas al proyecto como por ejemplo una de preguntas frecuentes.
Desafío: Mejorar la página Web
- Investiga las diferentes opciones que Sphinx no facilita para personalizar nuestro proyecto, como por ejemplo el cambio de tema.
- Puedes documentar mejor el programa añadiendo los docstring que consideres oportuno.
- Aloja tu proyecto en Github o en Read the Docs
Puede encontrar el código de este post en este enlace de Github.
No hay comentarios:
Publicar un comentario