¿Qué hace dignified-python?
Estándares de Python para producción opinados con detección automática de versión (3.10-3.13). Úsalo al escribir, revisar o refactorizar Python en repositorios que deseen sintaxis de tipos moderna, comprobaciones de condición explícitas cuando sea práctico, operaciones con pathlib, guía de interfaces y patrones de producción pragmáticos.
Resumen de Reglas
Sintaxis de Tipos Moderna
- Usa la sintaxis de tipos nativa de tu versión de Python (ej.
list[int]en lugar deList[int]desde Python 3.9+). - Prefiere
X | NonesobreOptional[X]cuando uses Python 3.10+.
Comprobaciones de Condición Explícitas
- Evita comprobaciones implícitas de verdad:
if x is not None:en lugar deif x:cuandoxpueda ser un valor no booleano. - Usa
if not x:solo cuandoxes un booleano conocido.
Operaciones con pathlib
- Siempre usa
pathlib.Pathpara operaciones con rutas de archivos. - Evita
os.path.join,os.path.exists, etc. a menos que haya una razón justificada.
Guía de Interfaces
- Define clases abstractas con
abc.ABCotyping.Protocolsegún corresponda. - Documenta claramente la interfaz esperada para colaboración en equipo.
Patrones de Producción Pragmáticos
- Prioriza la legibilidad sobre la brevedad.
- Usa
dataclassesopydanticpara estructuras de datos. - Escribe docstrings para funciones y clases públicas.
Cómo Usar
Este skill se activa automáticamente en repositorios que contienen archivos Python. El AI agent aplicará estas reglas durante:
- Escritura de código: Nuevos archivos Python, funciones, y clases.
- Revisión de código: Al revisar PRs o sugerir mejoras.
- Refactorización: Al modernizar código Python existente.
Detección de Versión
El skill detecta automáticamente la versión de Python del proyecto (3.10, 3.11, 3.12 o 3.13) basándose en:
- El archivo
pyproject.toml - El archivo
setup.cfg - El archivo
.python-version
Si no se puede detectar, se asume Python 3.10 como versión mínima.
Compatibilidad
- Claude Code: Totalmente soportado.
- Cursor: Totalmente soportado.
- Codex: Soporte básico.
- Copilot: Soporte parcial (algunas reglas pueden no aplicarse automáticamente).
Ejemplos
Correcto (Python 3.10+)
from pathlib import Path
from typing import Protocol
class DatosUsuario(Protocol):
nombre: str
edad: int | None
def procesar_archivo(ruta: Path) -> list[str]:
if not ruta.exists():
raise FileNotFoundError(f"Archivo no encontrado: {ruta}")
return ruta.read_text().splitlines()
Incorrecto
import os.path
from typing import List, Optional
class Usuario:
def __init__(self, nombre: str):
self.nombre = nombre
def procesar_archivo(ruta: str) -> List[str]:
if not os.path.exists(ruta):
raise FileNotFoundError(f"Archivo no encontrado: {ruta}")
with open(ruta) as f:
return [line.strip() for line in f if line.strip()]
Contribuciones
Para contribuir, por favor abre un issue o PR en el repositorio dagster-io/dignified-python.