讨论

高级Python架构师代码审计与重构提示

来自 Wikiprompt,自由的提示词百科全书

Discaury Salas

2026年1月10日

高级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 工具中。

为获得最佳效果,可将占位符(方括号或大写字母标示)替换为你的具体需求。

参考资料

分类:coding| prompts.chat| python| code-audit

讨论