Mejores prácticas en Python

Mejores prácticas en Python

Este artículo explica las mejores prácticas en Python.

Explicaremos las mejores prácticas de Python con ejemplos de código reales, presentando formas de escribir código legible y mantenible.

YouTube Video

Mejores prácticas en Python

Haz de la legibilidad la máxima prioridad

Primero, veamos lo de 'hacer de la legibilidad la máxima prioridad.'.

Python es un lenguaje que valora la 'legibilidad.'. En primer lugar, prioriza escribir código cuya intención sea clara a simple vista.

1# Bad example: unclear variable names
2a = 10
3b = 5
4c = a * b

En este código, los nombres de las variables no transmiten su significado, por lo que a otros les llevará tiempo entenderlo después.

1# Good example: descriptive variable names
2price = 10
3quantity = 5
4total_cost = price * quantity

Al hacer que los nombres de las variables sean específicos, tu código en sí mismo sirve como documentación.

Escribe código explícito

A continuación, veamos lo de 'escribir código explícito.'.

En Python, se prefiere la 'intención explícita' sobre el 'comportamiento implícito.'.

1# Bad example: implicit truthy check
2if data:
3    process(data)

En este código, no está claro qué se espera de data, creando terreno fértil para errores.

1# Good example: explicit condition
2if len(data) > 0:
3    process(data)

Al hacer explícitas las condiciones, la intención del código coincide con su especificación.

Mantén las funciones pequeñas y centradas en una sola responsabilidad

A continuación, veamos lo de 'mantener las funciones pequeñas y centradas en una sola responsabilidad.'.

Cuando una función hace demasiadas cosas, las pruebas y el mantenimiento se vuelven difíciles.

1# Bad example: doing too many things
2def handle_user(user):
3    save_to_database(user)
4    send_email(user)
5    write_log(user)

En este código, los procesos se acoplan fuertemente, lo que dificulta la reutilización y la modificación.

1# Good example: single responsibility
2def save_user(user):
3    save_to_database(user)
4
5def notify_user(user):
6    send_email(user)
7
8def log_user(user):
9    write_log(user)

Al dividir las funciones, sus roles se aclaran y las pruebas se facilitan.

Utiliza activamente anotaciones de tipo

A continuación, veamos lo de 'utilizar activamente anotaciones de tipo.'.

Las anotaciones de tipo sirven como documentación y son una herramienta poderosa para prevenir errores.

1# Bad example: Without type hints
2def add(a, b):
3    return a + b

En este código, los tipos de argumentos y valores de retorno no son claros, lo que facilita un uso indebido.

1# Good example: With type hints
2def add(a: int, b: int) -> int:
3    return a + b

Con las anotaciones de tipo, la autocompletación del IDE, el análisis estático y la legibilidad mejoran considerablemente.

Indica explícitamente la posibilidad de devolver None

A continuación, veamos lo de 'indicar explícitamente la posibilidad de devolver None.'.

Las funciones que pueden devolver None suelen ser pasadas por alto por quienes las usan.

1# Bad example: Ambiguous return value
2def find_user(user_id):
3    if user_id == 1:
4        return {"id": 1, "name": "Alice"}
5    return None

En este código, no está claro si habrá un valor de retorno.

1# Good example: explicit return type
2from typing import Optional, Dict, Any
3
4def find_user(user_id: int) -> Optional[Dict[str, Any]]:
5    if user_id == 1:
6        return {"id": 1, "name": "Alice"}
7    return None

Al usar Optional, puedes expresar la posibilidad de devolver None como tipo.

No captures excepciones de manera demasiado amplia

A continuación, veamos lo de 'no capturar excepciones de manera demasiado amplia.'.

El manejo de excepciones debería cubrir básicamente solo lo necesario.

1# Bad example: catching all exceptions
2try:
3    result = int(value)
4except Exception:
5    result = 0

Este código puede ocultar errores que deberían haberse detectado.

1# Good example: catch specific exception
2try:
3    result = int(value)
4except ValueError:
5    result = 0

Al restringir las excepciones, no pasarás por alto problemas inesperados.

Gestiona los recursos de forma segura con la sentencia with

A continuación, veamos lo de 'gestionar de forma segura los recursos con la sentencia with.'.

Recursos como archivos y bloqueos siempre deben liberarse de manera confiable.

1# Bad example: manual close
2file = open("data.txt")
3content = file.read()
4file.close()

En este código, si ocurre una excepción, puede que no se llame a close().

1# Good example: using context manager
2with open("data.txt") as file:
3    content = file.read()

Al usar una sentencia with, la limpieza se realiza de forma segura incluso si ocurre una excepción.

Utiliza las comprensiones de listas apropiadamente

A continuación, veamos lo de 'utilizar apropiadamente las comprensiones de listas.'.

Los procesos de transformación simples pueden escribirse de forma concisa utilizando comprensiones de listas.

1# Bad example: Verbose loop
2squares = []
3for i in range(10):
4    squares.append(i * i)

En este código, el proceso principal es difícil de ver.

1# Good example: Clear list comprehension
2squares = [i * i for i in range(10)]

Al utilizar comprensiones de listas apropiadamente, la legibilidad del código mejora.

Evita los números mágicos

A continuación, veamos lo de 'evitar los números mágicos.'.

Escribir números y cadenas directamente hace que su significado no sea claro.

1# Bad example: magic number
2if status == 404:
3    handle_not_found()

En este código, se asume que sabes el significado de 404.

1# Good example: named constant
2NOT_FOUND = 404
3
4if status == NOT_FOUND:
5    handle_not_found()

Asignar nombres aclara las intenciones.

Escribe código que sea mantenible, no solo código que 'funcione'

Finalmente, veamos lo de 'escribir código que sea mantenible, no solo código que funcione.'.

Lo importante es si tu yo futuro u otras personas pueden leerlo.

1# Bad example: Hard to maintain
2def f(x):
3    return x * 1.08 + 100

En este código, la especificación no se puede entender a partir del código.

1# Good example: Easy to maintain
2TAX_RATE = 1.08
3BASE_FEE = 100
4
5def calculate_total(price: float) -> float:
6    return price * TAX_RATE + BASE_FEE

Al reflejar el significado en los nombres, el código mismo se convierte en la especificación.

Resumen

Las mejores prácticas de Python se reducen a escribir código que sea fácil de entender, más que código ingenioso. Formar pequeños hábitos conduce a código con menos errores y que puede ser utilizado durante mucho tiempo.

Puedes seguir el artículo anterior utilizando Visual Studio Code en nuestro canal de YouTube. Por favor, también revisa nuestro canal de YouTube.

YouTube Video