Referencia de PEP 8 y Estilo
PEP 8 es la guía de estilo oficial de Python. Esta página destila las reglas que más importan en los proyectos modernos de Python 3.14 con la aplicación de ruff.
Receta
[tool.ruff]
line-length = 88
target-version = "py314"
[tool.ruff.lint]
select = ["E", "W", "F", "I"]uv run ruff format . && uv run ruff check --fix .Cuándo recurrir a esto:
- Resolver debates de estilo en la revisión de código
- Configurar ruff para un nuevo proyecto
- Incorporar desarrolladores de otros lenguajes
Referencia de PEP 8
| Tema | Regla | Ejemplo |
|---|---|---|
| Indentación | 4 espacios, sin tabulaciones | def foo(): + cuerpo de 4 espacios |
| Longitud de línea | 88 caracteres (predeterminado de Black/ruff) | Envolver con paréntesis |
| Importaciones | stdlib, terceros, local | Línea en blanco entre grupos |
| Nombres | snake_case, clases CapWords | mi_funcion, MiClase |
| Espacios en blanco | espacio alrededor de operadores | x = 1, a + b, no x=1 |
| Comentarios | oraciones completas | # Calcular total, no impuesto. |
| Cadenas | estilo de comillas consistente | comillas dobles (predeterminado de ruff) |
Ejemplo de Trabajo
# Buen estilo PEP 8
from __future__ import annotations
import os
from pathlib import Path
import httpx
from pydantic import BaseModel
class Invoice(BaseModel):
id: int
amount: float
customer_email: str
def fetch_invoice(client: httpx.Client, invoice_id: int) -> Invoice:
response = client.get(f"/invoices/{invoice_id}")
response.raise_for_status()
return Invoice.model_validate(response.json())
def main() -> None:
base = os.environ.get("API_URL", "http://localhost:8000")
with httpx.Client(base_url=base) as client:
invoice = fetch_invoice(client, 42)
print(invoice.customer_email)
if __name__ == "__main__":
main()Lo que esto demuestra:
- Dos líneas en blanco antes de funciones y clases de nivel superior
- Importaciones agrupadas y ordenadas
- Anotaciones de tipo en funciones públicas
- Guardia
if __name__para la ejecución de scripts
Inmersión Profunda
Convenciones de Nomenclatura
| Tipo | Convención | Ejemplo |
|---|---|---|
| Módulo | minúsculas | mi_modulo.py |
| Clase | CapWords | ServicioFactura |
| Función | snake_case | calcular_total |
| Constante | UPPER_SNAKE | MAX_RETRIES |
| Privado | _ inicial | _ayudante_interno |
| Métodos mágicos | dunder | __init__, __str__ |
Saltos de Línea
# Preferido: indentación colgante con paréntesis
result = some_function(
long_argument_one,
long_argument_two,
long_argument_three,
)
# Coma final en dict/lista es aceptable
settings = {
"host": "localhost",
"port": 8000,
}Trampas
- Tabulaciones vs. espacios - error de sintaxis al mezclar. Solución: el editor inserta espacios; ruff lo aplica.
- Espacios en blanco al final - diffs ruidosos. Solución: hook
trailing-whitespacede pre-commit. - Importaciones comodín -
from modulo import *contamina el espacio de nombres. Solución: importaciones explícitas. - Argumentos de valor predeterminado mutables -
def f(items=[]):estado compartido. Solución: predeterminadoNone, crear dentro. - Comparación con None - usar
is None, no== None.
Alternativas
| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| Estilo de Python de Google | Interoperabilidad con código de Google | Proyecto PEP 8 estándar |
| Estilo de documentación de numpy | Computación científica | Aplicaciones web generales |
| Formateo manual | Nunca | Siempre usar ruff format |
Preguntas Frecuentes
¿Líneas de 79 u 88 caracteres?
88 es el predeterminado moderno (Black/ruff). La consistencia importa más que el número exacto.
¿Comillas simples o dobles?
Elige una a través del formateador. ruff format usa comillas dobles por defecto.
¿Cuándo ignorar PEP 8?
Código generado, migraciones y casos raros donde romper la regla perjudica la legibilidad. Documentar con # noqa.
¿Ruff reemplaza la revisión de PEP 8?
Sí, para reglas mecánicas. La revisión humana todavía es necesaria para la calidad de la nomenclatura y la estructura.
¿Qué es E501?
Línea demasiado larga. Generalmente se ignora al usar ruff format.
¿Anotaciones de tipo y PEP 8?
Las anotaciones de tipo PEP 484 complementan PEP 8. Ver PEP 484 para el estilo de tipado.
¿Líneas en blanco en métodos?
Una línea en blanco entre métodos en una clase. Dos líneas en blanco entre definiciones de nivel superior.
¿Línea Shebang?
#!/usr/bin/env python3 solo para scripts ejecutables.
¿Declaración de codificación?
No es necesaria en Python 3. UTF-8 es el valor predeterminado.
¿Dónde está el PEP 8 completo?
peps.python.org/pep-0008/ - esta página es la destilación práctica.
Relacionado
- 50 Reglas de Python - reglas más amplias
- Configuración de Ruff - herramientas de aplicación
- Black / Ruff Format - formateo
- Mejores Prácticas de Linting - política de equipo
Versiones de Stack: Esta página fue escrita para Python 3.14.0, FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+, y uv 0.6+.