OpenWebinars

Lenguajes de Programación

Buenas prácticas en la escritura de codigo en Python

Descubre las mejores prácticas para la escritura de código en Python y consejos prácticos que te ayudarán a optimizar tu código y maximizar tu productividad, mejorando tu perfil como programador en Python.

Guillermo Ramiro Maquieira

Guillermo Ramiro Maquieira

Lectura 11 minutos

Publicado el 20 de junio de 2023

Compartir

Introducción

En un futuro cercano, la demanda de programadores de Python con habilidades en la escritura de código limpio y eficiente aumentará significativamente. ¿Estás preparado para destacar entre la competencia?

En este artículo descubrirás las mejores prácticas en la escritura de código en Python que te ayudarán a diferenciarte como profesional y asegurar tu éxito en el mundo de la programación.

Desde la estructura y organización del código hasta el uso adecuado de variables y la implementación de pruebas, aprenderás técnicas esenciales para crear programas de calidad que te abrirán nuevas oportunidades laborales.

Sigue leyendo y comienza a tomar conciencia de la necesidad de mejorar estos aspectos del desarrollo, para así formarte y hacer que tus habilidades como programador en Python atraigan a las empresas.

Qué son las buenas prácticas en Python

Las buenas prácticas en la escritura de código, si bien no se limitan a Python, son un conjunto de recomendaciones que te permitirán dar un salto de calidad al momento de entregar tus programas o resolución de entrevistas técnicas.

En el momento de una revisión técnica, ya sea en un pull request o encuentro de pares, aplicar este tipo de técnicas sentarán las bases para la escritura de un código profesional por sobre de un aficionado.

Es importante destacar que, si bien la base de las buenas prácticas es común a todos los lenguajes de programación, cada lenguaje tiene sus particularidades.

Importancia de las buenas prácticas en Python

La guía de estilos para el código Python, escrito por su creador Guido van Rossum hace más de 20 años y mantenido hasta la actualidad es normalmente referenciado como PEP-8 por sus siglas en inglés (Python Enhancements Proposals), como parte de las propuestas de mejoras para el lenguaje.

Si bien el presente artículo hará mayoritariamente referencia al mismo, se sugiere considerar otros PEP como complementar a esta lectura en particular.

Principios de la escritura de código en Python

Existen diferentes criterios, sin ser excluyentes unos de otros, a la hora de clasificar los principios de la escritura de código en Python.

Se manifiestan en la filosofía o Zen de Python siendo el mismo referenciado como PEP-20 por ser también uno de los Python Enhancements Proposals a tener en cuenta al momento de utilizar el lenguaje.

El texto a continuación representa la filosofía en cuestión:

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!

Y puede ser consultado a tipear desde el prompt de Python con la siguiente línea:

>>> import this

Conviértete en un Backend Developer
Domina los lenguajes de programación más demandados. Accede a cursos, talleres y laboratorios para crear proyectos con Java, Python, PHP, Microsoft .NET y más
Comenzar gratis ahora

Legibilidad

La legibilidad de un texto hace referencia a la cualidad de ser legible, por lo tanto, el código escrito en Python tiene que destacarse por tener facilidad de lectura.

En el Zen de Python se manifiesta el valor de la legibilidad por la frase Readability counts siendo que los bloques de código son más frecuentemente leídos que escritos.

El conjunto de normas para la guía de estilos para la escritura de código en Python puede encontrarse en el siguiente enlace oficial o en una recopilación alternativa.

Simplicidad

Una de las características que resulta atractiva de Python, no sólo para quienes dan sus primeros pasos en la programación, sino a programadores experimentados es la simpleza de su escritura y facilidad de compresión.

Esta característica fue una parte central al momento de realizar el diseño del lenguaje.

En ciertos pasajes de la escritura de código en Python, resulta notoria la característica de escribir un programa informático, de forma muy similar a lo que sería la escritura y lectura del idioma inglés.

Consistencia

La consistencia es la que determina la coherencia que debe existir entre las partes que conforman a un programa informático. Este programa debe ser consistente en su forma de realizar declaraciones, y de respetar, la lógica utilizada en el mismo.

Una vez definida cierta lógica para realizar una determinada operación, esta debe ser mantenida a lo largo de todo el programa, al no ser consistente utilizar una lógica distinta para realizar una misma operación.

En el Zen de Python existen dos manifestaciones al respecto como son In the face of ambiguity, refuse the temptation to guess. y There should be one—and preferably only one—obvious way to do it. lo que demuestra a la consistencia como un principio inexorable.

Modularidad

El principio de modularidad, con el que Python tiene una fuerte referencia, no es una buena práctica que se limite sólo a este lenguaje.

La tendencia inicial al escribir un programa informático es la de desarrollar un conjunto de líneas de código que resuelvan una determinada problemática. Una vez que esta problemática queda resuelta, se procede a realizar un refactor o code review, para encontrar la posibilidad de incluir mejoras en el código.

Alguna de estas mejoras puede ser la organización del programa en sub-programas o funciones específicas, destacando el principio de modularidad para la resolución, de manera más eficiente que la solución inicial propuesta a la problemática.

Elegancia

La facilidad de escritura y simpleza de lectura hacen que Python permita generar un código elegante con el sólo hecho de respetar sus buenas prácticas.

Tal es así, que la primera de las líneas de Zen de Python, manifiesta que Beautiful is better than ugly. lo que demuestra su importancia en la filosofía del lenguaje.

Una forma práctica de mantener el código elegante es la de utilizar un code analyzer que verifique la utilización de las buenas prácticas de PEP 8 tal como sostiene el package homónimo en su documentación:

$ pep8 --first optparse.py
optparse.py:69:11: E401 multiple imports on one line
optparse.py:77:1: E302 expected 2 blank lines, found 1
optparse.py:88:5: E301 expected 1 blank line, found 0
optparse.py:222:34: W602 deprecated form of raising exception
optparse.py:347:31: E211 whitespace before '('
optparse.py:357:17: E201 whitespace after '{'
optparse.py:472:29: E221 multiple spaces before operator
optparse.py:544:21: W601 .has_key() is deprecated, use 'in'

También es posible considerar un linter integrado a un IDE como puede ser el caso de Pylint con Visual Studio Code (entre otras opciones que soporta) como se demuestra en el siguiente artículo oficial.

Buenas prácticas para la escritura en Python

Una vez incorporados los principios de la escritura de código en Python es importante considerar la utilización de buenas prácticas adicionales que ayudarán a generar un código de aún mayor calidad.

Comentarios claros y concisos

Los comentarios en el código tienen que servir de ayuda a la compresión del mismo para quien lo lee. A pesar de existir distintas formas de comentar, en una o múltiples líneas, la importancia del comentario propiamente dicha radica en su contenido.

Los siguientes ejemplos ilustran la situación, a saber:

x = 4
y = 6
# Esta es la variable suma
suma = x + y
print("El resultado es: ", suma)

El comentario previo hace referencia al nombre de una variable, que ya de por sí, está implícito en su declaración lo que resulta redundante siendo un comentario que no aporta valor.

Cambiar la forma de realizar un comentario, tampoco hace la diferencia, puesto que el contenido es el mismo:

  • Comentario redundante de una línea:
x = 4
y = 6
# Esta es la variable suma
suma = x + y
print("El resultado es: ", suma)
  • Comentario redundante de múltiples líneas:
x = 4
y = 6
'''
Esta es la variable
suma
'''
suma = x + y
print("El resultado es: ", suma)
  • Comentario redundante:
x = 4
y = 6
"""
Esta es la variable
suma
"""
suma = x + y
print("El resultado es: ", suma)

Ya sea en una o múltiples líneas, el efecto del comentario, es igual de ineficiente.

Sin embargo, si se considera el comentario del siguiente bloque de código:

x = 4
y = 6
# Calculo del promedio
print("El resultado es: ", x+y/2)

La aclaración del tipo de la operación realizada puede resultar de interés, en caso de que la persona que lea el código, no haya prestado atención a la misma.

Nombrado de variables y funciones

Los nombres de variables y funciones tienen que ser, en primer lugar, representativos. En una declaración representativa, el nombre de la variable o función, denota por sí mismo su finalidad.

Considere el ejemplo del siguiente bloque de código:

nota_1 = 6
nota_2 = 8
promedio = (nota_1 + nota_2)/2
print("El promedio es: ", promedio)

Los nombres de las variables son representativos puesto que su nombre tiene asociado el significado de su contenido.

Adicionalmente, se destaca que en su declaración debe utilizarse minúsculas y en caso de ser necesario, guiones bajos para separar sus palabras entre sí.

Estos principios aplican de igual forma tanto a variables como a la declaración de funciones, a saber:

def promedio(nota_1, nota_2):
    nota_1 = 6
    nota_2 = 8
    promedio = (nota_1 + nota_2)/2
    return promedio

Uso adecuado de las estructuras de control de flujo

El flujo principal de un programa es secuencial, donde cada una de las líneas de un programa, se ejecutan una a continuación de otra.

Un flujo secuencial puede verse alterado por uno condicional, es decir, que su ejecución línea tras línea se vea bifurcada por una decisión lógica.

El flujo condicional tiene que determinar correctamente cuál es la lógica que el programa debe evaluar para tomar un camino u otro. A continuación, se detalla un ejemplo de código en el que se introduce un error de forma intencional:

from random import randint

x = randint(-10,10)

if (x > 0):
    print("El valor no es positivo")
else:
    print("El valor es positivo")

Si bien la condición lógica propuesta x > 0 es correcta, los mensajes aclaratorios no lo son, puesto que están en una ubicación incorrecta. El análisis del problema tampoco es completo puesto que omite un escenario en particular, que será detallado a continuación:

from random import randint

x = randint(-10,10)

if (x > 0):
    print("El valor es positivo")
elif (x < 0):
    print("El valor es negativo")
else:
    print("El valor es cero")

Una vez completados los escenarios correspondientes a un flujo condicional, y de haber resuelto el error introducido de forma voluntaria, se analiza el caso de los flujos de control iterativos. Estos flujos, que son representados por estructuras del tipo for o while, conllevan la problemática de generar involuntariamente un loop infinito tomando como base el ejemplo previo:

from random import randint

x = randint(1,10)

while (x > 0):
    print(x)
    x = randint(1,10)

Es importante verificar la condición lógica y los cambios de valor de las variables que contiene. En este caso, el bloque de código se ejecutaría en un bucle infinito, puesto que el número a generar será siempre positivo y resultará en consecuencia True el valor de verdad de la condición en todas y cada una de las iteraciones.

Organización de código en módulos y paquetes

En la primera escritura de código que se realice para dar la solución a un problema, es altamente probable que el mismo no se encuentre en un estado óptimo de organización en distintos módulos y/o paquetes.

Estos módulos provienen de la organización del código principal en funciones, para posteriormente ser aisladas en un fichero a tal efecto, siendo importado desde el programa principal.

De igual forma que estos módulos, una vez importados, se convierten en paquetes propios también es posible importar paquetes nativos a Python como el anteriormente utilizado random o desarrollados por la comunidad que resuelven determinadas problemáticas desde PyPI también conocido como The Python Package Index.

Uso de herramientas de análisis estático de código

Las herramientas de análisis estático de código, o code linters en inglés, son un aliado a la hora de escribir código libre de errores. Estos errores, que pueden ser detectados e informados por un analizador de código, incluyen errores de sintaxis, variables no definidas y omisión en la escritura de buenas prácticas.

Las dos opciones más populares son Flake8 y Pylint.

Errores comunes en la escritura de código en Python

Los errores comunes en la escritura de código Python pueden clasificarse en 3 categorías, siendo posible que ocurra más de un tipo de error al mismo tiempo.

Errores de sintaxis

Un error de sintaxis puede ocurrir cuando una palabra reservada del lenguaje no esté escrita correctamente, y, por ende, se mostrará un error del tipo SyntaxError siendo este parte de las built-in exceptions incluídas dentro del lenguaje.

Escribir de forma incorrecta el término import o la función print mostrará el mensaje SyntaxError: invalid syntax.

Errores de indentación

La indentación es parte de la sintaxis del lenguaje, por ende, un error en su implementación puede generar errores no deseados y/o alterar la lógica de un programa.

Si bien Python soporta indentación tanto a 2 como a 4 espacios, es necesario optar por una de ellas, e implementarla a lo largo de todo el programa a fin de no encontrar inconsistencias en su implementación.

Errores de lógica

Los errores de lógica son propios de la incorrecta definición de quién escribe el programa y no por errores que Python no fuere capaz de encontrar.

El planteo de una condición que contenga errores lógicos, puede ser el caso de evaluar cierto número, que deba cumplir que (n > 1) and (n < 1) lo cual no es lógico dado que no existe un número tal que sea mayor y menor que 1 al mismo tiempo.

Desafíos en la escritura de código en Python

Una vez advertidos los tipos de errores y lo que resta es hacer un manejo eficiente de los recursos y capacidades que el lenguaje brinda. Algunos de los casos a tener en cuenta se detallan a continuación.

Elección de algoritmos ineficientes

No existe una sóla forma para escribir la solución a un problema. Por ende, es posible escribir distintos algoritmos en la confección de un programa. Estos algoritmos pueden resultar más o menos performantes según su lógica y buenas prácticas implementadas.

Para realizar una medición y determinar cuál es el algoritmo más eficiente, es posible utilizar dos recursos que están incorporados dentro del lenguaje como son el profiler para ficheros .py como parámetro y el módulo timeit para evaluar líneas de código:

  • python -m cProfile fichero_python.py
  • python -m timeit ‘Código escrito en Python

Gestión incorrecta de excepciones

Las excepciones deben gestionarse bajo la forma de try/except e incluyendo un bloque finally en caso de ser necesario.

Una gestión correcta de una excepción consiste en incluir dentro del bloque try aquel código que es factible que arroje un error. Posteriormente, en el bloque except analizar la excepción concreta que arrojará en caso de que suceda el error. Por último, y en caso de ser necesario, incluir un bloque finally el cual se ejecutará independientemente de que haya sucedido el error o no.

Considerar la gestión de la excepción bajo la siguiente forma:

try:
    # Bloque de código con posible error
except TipoDeExcepcion:
    # Detallar el error sucedido
finally:
    # Detallar los pasos en común a ejecutar

Uso inadecuado de la memoria

Python tiene la característica de ser un lenguaje que abstrae el manejo de la memoria, pudiendo declarar y utilizar distintas estructuras de datos, con sólo ser invocadas de una forma simple.

Si bien no es necesario asignar memoria dinámicamente con funciones como malloc y free tal como es el caso del lenguaje C, es la implementación de CPython la que se encarga de esta tarea por el usuario.

Para más información sobre la gestión de la memoria considerar el siguiente enlace oficial.

Mejora las habilidades de tus desarrolladores
Acelera la formación tecnológica de tus equipos con OpenWebinars. Desarrolla tu estrategia de atracción, fidelización y crecimiento de tus profesionales con el menor esfuerzo.
Solicitar más información

Buenas prácticas para la revisión de código en Python

La revisión de código es una actividad que suele suceder cuando dos o más programadores trabajan sobre una misma pieza de software.

Se detallan a continuación ciertas recomendaciones a tener en cuenta para lograr una comunicación y coordinación efectiva en la escritura simultánea de código Python por parte de un equipo de desarrollo.

Definición de un estilo de codificación consistente en el equipo

La definición de un estilo consistente es una actividad liderada por los desarrolladores más experimentados. Estas personas son las encargadas de definir la estrategia para unificar un estilo de codificación consistente en el equipo.

Esta tarea puede incluir, aunque no limitarse, a los siguientes aspectos:

  • Utilización de un mismo IDE como entorno de desarrollo.
  • Definición de las buenas prácticas mandatorias en la escritura de código.
  • Definición de las buenas prácticas opcionales en la escritura de código.
  • Definición de a pares para la escritura de código asistido por la técnica de pair programming.
  • Definición de las versiones a utilizar tanto de packages como el lenguaje de programación propiamente dicho.
  • Estándar para la documentación de nuevas funcionalidades a desarrollar.

Revisiones regulares entre los miembros del equipo

Las revisiones regulares entre los miembros del equipo pueden darse de forma espontánea, o bien, en el marco del proceso de desarrollo de software durante un sprint. Estas tareas, que puede estar o no incluídas en la planificación del trabajo, son necesarias tanto para que un perfil senior transmita las buenas prácticas a un perfil junior así como la definición de nuevas estrategias entre perfiles senior.

Otra instancia la que suele sucecer este tipo de revisiones en los pull requests o merge de código donde se realizan comentarios constructivos a fin de que el código resultante sea el de la mayor calidad posible.

Sea cual fuere el lenguaje de programación, esta actividad es siempre recomendable, para fomentar la colaboración y trabajo de a pares en el equipo de desarrollo.

Uso de herramientas de revisión de código

Existen distintas herramientas para la revisión de código, siendo SonarQube una de las más importantes del mercado. Adicionalmente, existen algunas funcionalidades automatizadas de GitHub para la revisión de código como Codacy y CodeFactor que son alternativas interesantes de analizar e implementar.

Conclusiones

Python es un lenguaje que por su estética y simpleza en la escritura trae incorporadas las buenas prácticas en el manifiesto de su Zen. Apegarse al mismo, así como recordar las buenas prácticas de PEP 8 permiten lograr la escritura de código con una calidad desde su concepción, ya sea para quienes dan sus primeros pasos con el lenguaje o desarrolladores experimentados.

En la actualidad sucede el auge de la inteligencia artificial para la escritura de código como puede darse en el caso de la utilización de herramientas como GitHub Copilot aunque estas pueden utilizarse de manera complementaria en caso de consultar otras formas adicionales a las buenas prácticas de código.

Si quieres formarte a fondo en Python y en muchas otras tecnologías, OpenWebinars ofrece un trial de 15 días gratis dentro de su Plan Profesional, para potenciar tus conocimientos todo lo que quieras.

También puedes solicitar una demostración gratuita si quieres llevar a otro nivel la formación de las personas de tu equipo de trabajo, así conocerás todo lo que esta plataforma ofrece en la formación para empresas.

Bombilla

Lo que deberías recordar de las buenas prácticas en Python

  • Las buenas prácticas en la escritura de código son un conjunto de recomendaciones para mantener la calidad en tus desarrollos.
  • La guía de estilos para el código Python se suele nombrar como PEP-8, y forma parte de las propuestas de mejoras para el lenguaje.
  • Existen diferentes criterios, sin ser excluyentes unos de otros, a la hora de clasificar los principios de la escritura de código en Python.
  • Se recomienda aplicar la filosofía o Zen de Python, a veces nombrado como PEP-20, a la hora de utilizar este lenguaje.
  • Los principios de la escritura de código en Python son: legibilidad, simplicidad, consistencia, modularidad y elegancia.
  • Las buenas prácticas para la escritura en Python afectan a aspectos como: comentarios, variables y funciones, estructuras de control de flujo, etc.
  • Los errores en la escritura de código Python se dividen en: errores de sintaxis, de indentación y de lógica.
  • Algunas buenas prácticas para la revisión de código son: definir un estilo de codificación consistente, establecer revisiones regulares y el uso de herramientas de revisión.
Compartir este post

También te puede interesar

Icono de la tecnología
Curso

Python 3 desde cero

Intermedio
6 h. y 8 min.

Descubre el fascinante mundo del lenguaje de programación que funciona como una auténtica navaja suiza cuando se trata...

José Domingo Muñoz
4.5
Icono de la tecnología
Curso

Python 3

Intermedio
10 h. y 16 min.

Tu pasaporte a sabelotodo de Python. Desde las bases hasta la creación de tu primer programa, este curso...

José Domingo Muñoz
4.4