高级Python架构师代码审计与重构提示
来自 Wikiprompt,自由的提示词百科全书
高级Python架构师代码审计与重构提示 一份全面的Python代码审计与重构提示,遵循严格标准、现代化要求,并以西班牙语输出。
提示词内容收藏
🌐
- **Eliminación de código redundante**: Se consolidaron funciones duplicadas y se simplificó la lógica de validación, reduciendo la complejidad ciclomática.
- **Adopción de tipado estático**: Se añadieron type hints en todas las funciones y variables, mejorando la legibilidad y facilitando el mantenimiento.
- **Uso de dataclasses**: Se reemplazaron diccionarios y clases manuales por dataclasses, mejorando la eficiencia y claridad del código.
- **Mejora en manejo de errores**: Se implementaron excepciones específicas y se añadió logging estructurado para facilitar la depuración.
- **Optimización de algoritmos**: Se sustituyeron bucles anidados por comprensiones de listas y se utilizaron estructuras de datos más eficientes (sets, defaultdict).
- **Modernización de sintaxis**: Se aplicaron f-strings, match-case (Python 3.10+) y se eliminaron construcciones obsoletas.
- **Cumplimiento estricto de PEP 8**: Se ajustaron nombres, espaciado y estructura del código para cumplir con las guías de estilo.
- **Seguridad mejorada**: Se añadieron validaciones de entrada y se previenen posibles inyecciones o accesos no autorizados.
```python
from __future__ import annotations
import json
import logging
import re
from dataclasses import dataclass, field
from datetime import datetime
from pathlib import Path
from typing import Any, Dict, List, Optional, Union
import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry
# Configuración de logging
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
handlers=[logging.StreamHandler()],
)
logger = logging.getLogger(__name__)
# Constantes
DEFAULT_TIMEOUT = 10
MAX_RETRIES = 3
BACKOFF_FACTOR = 0.5
STATUS_FORCELIST = [500, 502, 503, 504]
@dataclass
class Config:
"""Configuración de la aplicación."""
api_url: str
api_key: str
output_dir: Path = field(default_factory=lambda: Path("output"))
max_items: int = 100
verbose: bool = False
def __post_init__(self) -> None:
"""Validación de configuración."""
if not self.api_url.startswith(("http://", "https://")):
raise ValueError("api_url debe ser una URL válida")
if not self.api_key:
raise ValueError("api_key no puede estar vacía")
self.output_dir.mkdir(parents=True, exist_ok=True)
@dataclass
class DataItem:
"""Representa un elemento de datos procesado."""
id: str
name: str
value: float
timestamp: datetime
metadata: Dict[str, Any] = field(default_factory=dict)
@classmethod
def from_dict(cls, data: Dict[str, Any]) -> "DataItem":
"""Crea una instancia desde un diccionario."""
try:
return cls(
id=str(data["id"]),
name=str(data["name"]),
value=float(data["value"]),
timestamp=datetime.fromisoformat(data["timestamp"]),
metadata=data.get("metadata", {}),
)
except (KeyError, ValueError, TypeError) as exc:
raise ValueError(f"Datos inválidos: {exc}") from exc
class APIClient:
"""Cliente HTTP con reintentos y manejo de errores."""
def __init__(self, config: Config) -> None:
self.config = config
self.session = self._create_session()
def _create_session(self) -> requests.Session:
"""Crea una sesión con reintentos configurados."""
session = requests.Session()
retry_strategy = Retry(
total=MAX_RETRIES,
backoff_factor=BACKOFF_FACTOR,
status_forcelist=STATUS_FORCELIST,
allowed_methods=["GET", "POST", "PUT", "DELETE"],
)
adapter = HTTPAdapter(max_retries=retry_strategy)
session.mount("http://", adapter)
session.mount("https://", adapter)
session.headers.update({"Authorization": f"Bearer {self.config.api_key}"})
return session
def fetch_data(self, endpoint: str, params: Optional[Dict[str, Any]] = None) -> List[Dict[str, Any]]:
"""Obtiene datos de la API con manejo de errores."""
url = f"{self.config.api_url.rstrip('/')}/{endpoint.lstrip('/')}"
try:
response = self.session.get(url, params=params, timeout=DEFAULT_TIMEOUT)
response.raise_for_status()
data = response.json()
if not isinstance(data, list):
raise ValueError("La respuesta no es una lista")
return data[: self.config.max_items]
except requests.exceptions.RequestException as exc:
logger.error("Error en la petición a %s: %s", url, exc)
raise
except (json.JSONDecodeError, ValueError) as exc:
logger.error("Error al procesar la respuesta de %s: %s", url, exc)
raise
class DataProcessor:
"""Procesa y transforma los datos obtenidos."""
def __init__(self, config: Config) -> None:
self.config = config
def process(self, raw_data: List[Dict[str, Any]]) -> List[DataItem]:
"""Procesa los datos crudos y devuelve elementos validados."""
items = []
for raw in raw_data:
try:
item = DataItem.from_dict(raw)
if self._validate_item(item):
items.append(item)
except ValueError as exc:
logger.warning("Elemento omitido: %s", exc)
return items
def _validate_item(self, item: DataItem) -> bool:
"""Valida un elemento según reglas de negocio."""
if item.value < 0:
logger.warning("Valor negativo ignorado: %s", item.id)
return False
if not re.match(r"^[A-Za-z0-9_-]+$", item.id):
logger.warning("ID inválido: %s", item.id)
return False
return True
class ReportGenerator:
"""Genera reportes en diferentes formatos."""
def __init__(self, config: Config) -> None:
self.config = config
def generate_json(self, items: List[DataItem], filename: str = "report.json") -> Path:
"""Genera un reporte JSON."""
output_path = self.config.output_dir / filename
data = [self._item_to_dict(item) for item in items]
try:
with output_path.open("w", encoding="utf-8") as f:
json.dump(data, f, indent=2, ensure_ascii=False, default=str)
logger.info("Reporte JSON generado: %s", output_path)
return output_path
except OSError as exc:
logger.error("Error al escribir el archivo %s: %s", output_path, exc)
raise
def generate_summary(self, items: List[DataItem]) -> Dict[str, Any]:
"""Genera un resumen estadístico."""
if not items:
return {"count": 0, "total_value": 0.0, "avg_value": 0.0}
values = [item.value for item in items]
return {
"count": len(items),
"total_value": sum(values),
"avg_value": sum(values) / len(values),
"max_value": max(values),
"min_value": min(values),
}
@staticmethod
def _item_to_dict(item: DataItem) -> Dict[str, Any]:
"""Convierte un DataItem a diccionario serializable."""
return {
"id": item.id,
"name": item.name,
"value": item.value,
"timestamp": item.timestamp.isoformat(),
"metadata": item.metadata,
}
def main(config: Optional[Config] = None) -> int:
"""Función principal del script."""
try:
if config is None:
config = Config(
api_url="https://api.example.com",
api_key="your-api-key",
output_dir=Path("output"),
)
client = APIClient(config)
processor = DataProcessor(config)
report_gen = ReportGenerator(config)
raw_data = client.fetch_data("items", params={"limit": config.max_items})
items = processor.process(raw_data)
report_path = report_gen.generate_json(items)
summary = report_gen.generate_summary(items)
if config.verbose:
logger.info("Resumen: %s", json.dumps(summary, indent=2))
else:
logger.info("Procesados %d elementos. Reporte en %s", len(items), report_path)
return 0
except Exception as exc:
logger.error("Error fatal: %s", exc)
return 1
if __name__ == "__main__":
raise SystemExit(main())
```
用法
此提示词专为 coding 设计。复制上方内容并粘贴到你常用的 AI 工具中。
为获得最佳效果,可将占位符(方括号或大写字母标示)替换为你的具体需求。
讨论
0 条评论