Buenas Prácticas de Programación en Python
Buenas Prácticas de Programación en Python
Ene 09
En toda disciplina del saber humano la experiencia práctica es fundamental, de la práctica se derivan lecciones muy importantes que difícilmente se olvidan. Estas
lecciones generalmente se convierten en los que podríamos llamar “buenas prácticas”. Cuando nos dedicamos a la programación en Python
(http://pythonscouts.cubava.cu/2017/09/15/que-es-python-rasgos-distintivos/), también podemos encontrar estas buenas prácticas. Veamos algunas de ellas sin
pretender ser exhaustivos o creer que tenemos en la mano la verdad absoluta, pues simplemente no hay nada absoluto, lo que hoy es considerado bueno, mañana puede
no ser adecuado, todo depende del contexto y hasta del individuo, además, Python (http://pythonscouts.cubava.cu/2017/09/15/que-es-python-rasgos-distintivos/) es
un ente vivo que evoluciona todos los días. La ciencia avanza y con este avance cambia nuestra percepción de las cosas. Finalmente, sin más preámbulo, les dejo un
intento de resumir algunas “buenas prácticas de programación en Python”:
Si tus módulos pueden ser importados y/o ejecutados como (http://pythonscouts.cubava.cu/2017/10/02/como-ejecutar-scripts-python/)script emplea siempre el
fragmento de código if __name__ == '__main__': , para evitar la ejecución innecesaria del código cuando importes el módulo (Figura 1)
Agrupa en módulos el código con objetivos y funcionalidades similares o relacionadas, luego importa los módulos desde el módulo principal o desde donde los
necesites
Crea tu propio conjunto de módulos utilitarios, modifica tu PYTHONPATH y úsalos regularmente en tus proyectos
Emplea una estructura de paquetes y directorios coherente en tus proyectos, la Figura 2 podría servirte de guía general, con la observación de que el paquete
principal ( mypackage ) debería tomar el mismo nombre de tu proyecto o aplicación
http://pythonscouts.cubava.cu/2018/01/09/buenas-practicas-de-programacion-en-python/ 1/5
8/10/2018 Buenas Prácticas de Programación en Python | Python Scouts
Has uso de entornos virtuales (virtual environments) para evitar convertir tu sistema base en un lío
Emplea un sistema de control de versiones para trabajar tus proyectos de manera consistente y evitar pérdidas irreparables. Mi recomendación: Git (https://git-
scm.com/docs)
Si pretendes hacer que tu proyecto o aplicación sea Software Libre u Open Source y que otros desarrolladores colaboren, debes valorar la Gestión de Proyecto con
GitHub.com (https://github.com)
Asume un estilo de codificación y sé consecuente con él a lo largo de todo el proyecto. El PEP 8 (https://www.python.org/dev/peps/pep-0008/) es un excelente
lugar por donde comenzar
Comenta el código siempre que lo creas necesario, aunque un código bien escrito y legible no requiere de muchos comentarios
Si actualizas tu código, actualiza también tus comentarios; no hay peor comentario que uno desactualizado
No comentes lo obvio
>>> # Sumando x + y
>>> x + y
En lo personal los comentarios siempre me han parecido trabajo doble, por eso trato de que mi código sea lo más legible
(http://pythonscouts.cubava.cu/2017/09/25/el-zen-de-python-guia-para-pythonistas/) posible y así los evito. Cuidado con los comentarios, a veces denotan la
necesidad de refactorizar el código
No te repitas a ti mismo, aplica el principio DRY (https://es.wikipedia.org/wiki/No_te_repitas) (Don’t Repeat Yourself). Cuando identifiques código repetitivo o
similar o cuando te sorprendas copiando y pegando fragmentos de código, extrae el fragmento, conviértelo en una función o en un método
(http://pythonscouts.cubava.cu/2018/02/27/funciones-en-python/) y llámalo desde los lugares donde lo requieras
Usa coherentemente la indentación del código, esto mejora notablemente la legibilidad del mismo y en Python (http://pythonscouts.cubava.cu/2017/09/15/que-
es-python-rasgos-distintivos/) es parte de la sintaxis del lenguaje (http://pythonscouts.cubava.cu/2018/01/31/la-sintaxis-de-python/)
Para la indentación es recomendable usar espacios (de preferencia 4) en lugar de caracteres de tabulación, debido a que diferentes sistemas/editores pueden tener
diferentes configuraciones de tabulación
Emplea nombres cortos y descriptivos para tus variables, funciones (http://pythonscouts.cubava.cu/2018/02/27/funciones-en-python/), clases y atributos. Los
nombres son clave para la legibilidad de tu código, selecciónalos adecuadamente
No emplees como nombres para tus variables y atributos, las palabras reservadas (http://pythonscouts.cubava.cu/2017/10/18/las-palabras-clave-keywords-de-
python/) o los nombres de estructuras propias del lenguaje (built-ins), si esto fuera estrictamente necesario para garantizar la legibilidad de tu código, añade un
guión bajo al final del nombre para diferenciarlo, ejemplo: list_ = [1, 2, 3, 4]
Evita usar la sentencia from module import * , conocida como Wildcard imports, que además de poblar tu espacio de nombres con atributos que no vas a
emplear, resulta contraproducente en términos de legibilidad de código. Recuerda, “la legibilidad cuenta”
Mantén el código simple, aplica el principio KISS (https://es.wikipedia.org/wiki/Principio_KISS) (Keep It Simple Stupid). Recuerda que “Simple es mejor que
complejo”
No emplees el operador “==” para comparar objetos de tipo singleton como None , en su lugar emplea el operador is/is not , como en: if var is not None:
Escribe los casos de prueba antes que el propio código, esto te ayudará a definir mejor el problema y los requisitos de la solución y de seguro incrementará la
calidad de tu código (Test Driven Development (http://pythonscouts.cubava.cu/2018/02/16/desarrollo-guiado-por-pruebas-tdd-en-python/))
http://pythonscouts.cubava.cu/2018/01/09/buenas-practicas-de-programacion-en-python/ 2/5
8/10/2018 Buenas Prácticas de Programación en Python | Python Scouts
Emplea el Ciclo Red/Green/Refactor (http://pythonscouts.cubava.cu/2018/02/16/desarrollo-guiado-por-pruebas-tdd-en-python/)para tus pruebas, es decir,
Red: escribe tu prueba y córrela (no pasa), Green: escribe el código necesario para pasar la prueba (pasa), Refactor: modifica tu código para que quede mejor
escrito, sea más legible y más eficiente, pero manteniendo sus resultados finales. Corre nuevamente las pruebas
Realiza pruebas de lo que estás codificando a cada momento. Asegúrate de que funciona correctamente antes de incluirlo en tu código final, para esto te puedes
auxiliar del una sección interactiva (http://pythonscouts.cubava.cu/2017/09/28/el-interprete-python/) en el intérprete de Python
(http://pythonscouts.cubava.cu/2017/09/28/el-interprete-python/), o de otras herramientas como IPython (https://ipython.org/)
Realiza pruebas al código (http://pythonscouts.cubava.cu/2018/02/16/desarrollo-guiado-por-pruebas-tdd-en-python/) que se relacione con el código que estás
modificando (no solo al código modificado), para asegurarte de que toda tu base de código continúa funcionando correctamente y evitar las regresiones
Manejo de Errores
Lanza excepciones a bajo nivel y atrápalas a alto nivel, así podrás tener un código más fácil de mantener, pues las modificaciones/actualizaciones serán en solo
unos poco lugares
Como regla general, es mejor ser específico que genérico a la hora de manejar las excepciones, por ejemplo: evita usar la clase Exception en un bloque try/except,
Exception es una clase de excepción muy amplia, lo que significa que atraparías lo que quiere atrapar y lo que no. Recuerda que los “errores no deben pasar
silenciosamente (http://pythonscouts.cubava.cu/2017/09/25/el-zen-de-python-guia-para-pythonistas/)”
Usa siempre excepciones basadas en clases, para garantizar compatibilidad con otras versiones de Python (http://pythonscouts.cubava.cu/2017/09/15/que-es-
python-rasgos-distintivos/)
Implementa tus propias excepciones solo cuando creas que las disponibles en Python (http://pythonscouts.cubava.cu/2017/09/15/que-es-python-rasgos-
distintivos/) no satisfacen tus necesidades específicas
Optimización
Regresa a tu código algún tiempo después y revísalo en busca de mejoras, posibles errores y oportunidades de optimización, pero ojo, no te obsesiones con la
optimización, este afán puede romper tu código y hacerte perder horas de tu tiempo en vano
Antes de pensar en optimizar tu código, asegúrate de que has logrado que funcione correctamente, esto es lo más importante
Considera usar un generador (generator expression) siempre que estés trabajando con una función (http://pythonscouts.cubava.cu/2018/02/27/funciones-en-
python/) que devuelva una secuencia o que trabajes en un ciclo
Importa nombres específicos con la sentencia from module import attribute , esto incluye el nombre del atributo en tu espacio de nombres en tiempo de
importación y mejora el desempeño en tiempo de ejecución
Seguridad
Valida siempre los datos de entrada suministrados por el usuario antes de realizar cualquier operación con ellos
Nunca manejes/transmitas datos sensibles del usuario en forma de texto plano u otra forma no segura
Cuando emplees código de terceros, asegúrate de que ha sido ampliamente probado y que funciona correctamente, y que además, mantiene un desarrollo activo
Como de seguro no tendrás el tiempo y/o la habilidad de escribir código perfecto, concéntrate en los fragmentos de tu código que se encargan de recibir y procesar
información del exterior, no solo del usuario, sino también de archivos, de sitios web, de otras aplicaciones, etc.
Si pretendes incluir extensiones escritas en C/C++ en tus proyectos, sé cuidadoso con el manejo de memoria y otras vulnerabilidades clásicas de estos lenguajes
Evita por todos los medios que tus aplicaciones requieran correr con privilegios de administración y si es imprescindible hacerlo, minimiza el tiempo de empleo de
estos privilegios. Recuerda que esto puede comprometer la seguridad del sistema completo
Emplea la técnica del Duck Typing (https://es.wikipedia.org/wiki/Duck_typing) para evitar el uso de la herencia cuando sea posible
Aplica el principio Open/Close (https://en.wikipedia.org/wiki/Open/closed_principle), procurando que tu código quede abierto a la extensión y cerrado a la
modificación
El uso de la función incluida super() debe ser consistente, es decir, en una jerarquía de clases, super() debe ser usada en todos o en ningún lugar. Mezclar
super() y la llamada clásica es una práctica confusa
No mezcles old-style y new-style clases: tener un código base con ambos estilos de clases resulta en un comportamiento MRO
(https://docs.python.org/3/glossary.html#term-method-resolution-order)(Method Resolution Order) variable
Aprende patrones de diseño orientado a objetos y empléalos para mejorar la mantenibilidad y el diseño de tu código
http://pythonscouts.cubava.cu/2018/01/09/buenas-practicas-de-programacion-en-python/ 3/5
8/10/2018 Buenas Prácticas de Programación en Python | Python Scouts
Emplea coherentemente las convenciones de nombrado: self para identificar al objeto concreto en la definición de clases, cls para identificar la clase en los
métodos de clase, guión bajo al inicio del nombre de atributos privados y doble guión bajo para invocar el name mangling de Python
(http://pythonscouts.cubava.cu/2017/09/15/que-es-python-rasgos-distintivos/) y evitar la colisión de nombre en jerarquías de clases
No accedas a atributos o miembros de clases que hayan sido definidos como privados, desde fuera de la clase en cuestión
Bien, esto es todo por ahora, si este artículo te resultó interesante y/o útil, compártelo para que otros también puedan acceder a él. Déjanos tus comentarios y podremos
mejorar nuestros contenidos.
Gracias de antemano,
lpozo (http://pythonscouts.cubava.cu/acerca-de-mi/)
(https://www.addtoany.com/share#url=http%3A%2F%2Fpythonscouts.cuba
practicas-de-programacion-en-
python%2F&title=Buenas%20Pr%C3%A1cticas%20de%20Programaci%C3
Buenas Prácticas (http://pythonscouts.cubava.cu/tag/buenas-practicas/), Estilo de Codificación (http://pythonscouts.cubava.cu/tag/estilo-de-codificacion/),
Excepciones (http://pythonscouts.cubava.cu/tag/excepciones/), Git (http://pythonscouts.cubava.cu/tag/git/), Nose (http://pythonscouts.cubava.cu/tag/nose/),
Optimización (http://pythonscouts.cubava.cu/tag/optimizacion/), PEP8 (http://pythonscouts.cubava.cu/tag/pep8/), Programación
(http://pythonscouts.cubava.cu/tag/programacion/), PyCharm (http://pythonscouts.cubava.cu/tag/pycharm/), Pytest
(http://pythonscouts.cubava.cu/tag/pytest/), Python (http://pythonscouts.cubava.cu/tag/python/), Seguridad (http://pythonscouts.cubava.cu/tag/seguridad/),
Sphinx (http://pythonscouts.cubava.cu/tag/sphinx/)
(http://pythonscouts.cubava.cu/author/pythonscouts/)
(mailto:lpozo78@nauta.cu)
2 comentarios
1.
yrh on 10 enero, 2018
Hola quiero iniciarme en la programación con Python y creo que este sitio es muy bueno. Ojalá lo mantengan actualizado y no muera como
otros de la plataforma.
1.
Leodanis Pozo Ramos () on 11 enero, 2018
Author
Eres bienvenido. Nuestro objetivo es mantenerlo y que sirva a todos los que se inician o ya están usando Python.
saludos,
lpozo
Entradas recientes
Tipos de Datos en Python: Listas (http://pythonscouts.cubava.cu/2018/10/08/tipos-de-datos-en-python-listas/)
Cómo Determinar si Todos los Elementos de una Lista son Iguales (http://pythonscouts.cubava.cu/2018/09/18/como-determinar-si-todos-los-elementos-de-una-
lista-son-iguales/)
VideoMorph, Versión 1.4 (http://pythonscouts.cubava.cu/2018/09/16/videomorph-version-1-4/)
Cómo Identificar Código que Apesta (Code Smell) (http://pythonscouts.cubava.cu/2018/08/17/como-identificar-codigo-que-apesta-code-smell/)
VideoMorph 1.3.1, Versión de Mantenimiento (http://pythonscouts.cubava.cu/2018/07/24/videomorph-1-3-1-version-de-mantenimiento/)
Categorías
Aplicaciones (http://pythonscouts.cubava.cu/category/aplicaciones/)
http://pythonscouts.cubava.cu/2018/01/09/buenas-practicas-de-programacion-en-python/ 4/5
8/10/2018 Buenas Prácticas de Programación en Python | Python Scouts
Entrevistas (http://pythonscouts.cubava.cu/category/entrevistas/)
Patrones de Diseño (http://pythonscouts.cubava.cu/category/patrones-de-diseno/)
Temas Programación (http://pythonscouts.cubava.cu/category/temas-programacion/)
Temas Python (http://pythonscouts.cubava.cu/category/temas-python/)
Tutoriales (http://pythonscouts.cubava.cu/category/tutoriales/)
Archivos
octubre 2018 (http://pythonscouts.cubava.cu/2018/10/)
septiembre 2018 (http://pythonscouts.cubava.cu/2018/09/)
agosto 2018 (http://pythonscouts.cubava.cu/2018/08/)
julio 2018 (http://pythonscouts.cubava.cu/2018/07/)
junio 2018 (http://pythonscouts.cubava.cu/2018/06/)
mayo 2018 (http://pythonscouts.cubava.cu/2018/05/)
abril 2018 (http://pythonscouts.cubava.cu/2018/04/)
marzo 2018 (http://pythonscouts.cubava.cu/2018/03/)
febrero 2018 (http://pythonscouts.cubava.cu/2018/02/)
enero 2018 (http://pythonscouts.cubava.cu/2018/01/)
diciembre 2017 (http://pythonscouts.cubava.cu/2017/12/)
noviembre 2017 (http://pythonscouts.cubava.cu/2017/11/)
octubre 2017 (http://pythonscouts.cubava.cu/2017/10/)
septiembre 2017 (http://pythonscouts.cubava.cu/2017/09/)
(http://pythonscouts.cubava.cu/feed/)
(https://twitter.com/lpozo78)
(http://creativecommons.org/licenses/by-nc-sa/4.0/)
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License (http://creativecommons.org/licenses/by-nc-sa/4.0/)
http://pythonscouts.cubava.cu/2018/01/09/buenas-practicas-de-programacion-en-python/ 5/5