Prompts Interactivos
Los prompts interactivos recopilan la entrada del usuario para asistentes, confirmaciones y configuraciones guiadas. Usa los prompts integrados de Click para casos sencillos; questionary para interfaces de selección enriquecidas.
Receta
import questionary
name = questionary.text("Nombre del proyecto:").ask()
framework = questionary.select("Framework?", choices=["FastAPI", "Django", "Flask"]).ask()
confirmed = questionary.confirm("¿Continuar?").ask()Cuándo recurrir a esto:
- Asistentes de andamiaje de proyectos (estilo
cookiecutter) - Operaciones destructivas que requieren confirmación
- Configuración de varios pasos donde las banderas serían difíciles de manejar
Ejemplo de Trabajo
import questionary
from rich.console import Console
console = Console()
def run_setup_wizard() -> dict:
if not questionary.confirm("¿Ejecutar configuración interactiva?").ask():
raise SystemExit("Abortado")
answers = {
"name": questionary.text("Nombre del proyecto:", validate=lambda t: len(t) > 0 or "Requerido").ask(),
"framework": questionary.select(
"Framework web:",
choices=["FastAPI", "Django", "Flask"],
).ask(),
"database": questionary.checkbox(
"Características:",
choices=["postgres", "redis", "celery"],
).ask(),
"deploy": questionary.select(
"Destino de despliegue:",
choices=["Docker", "Lambda", "VPS"],
).ask(),
}
if not questionary.confirm(f"¿Crear {answers['name']} con {answers['framework']}?").ask():
raise SystemExit("Abortado")
return answers
if __name__ == "__main__":
config = run_setup_wizard()
console.print(f"[green]Creando proyecto: {config}[/green]")Lo que esto demuestra:
- Tipos de prompt de texto, selección, casilla de verificación y confirmación
- Validación de entrada de texto
- Abortar en cancelación (Ctrl+C o No)
- Salida enriquecida después de que el asistente se completa
Inmersión Profunda
Selección de Prompts
| Biblioteca | Mejor para |
|---|---|
click.confirm/prompt | Confirmación/texto simple |
questionary | Selección, casilla de verificación, autocompletado |
prompt_toolkit | REPL completo personalizado |
InquirerPy | Alternativa a questionary |
Trampas Comunes
- Prompts interactivos en CI - se cuelga para siempre. Solución: detectar
CI=trueo la bandera--yespara omitir los prompts. - Sin valor predeterminado para confirmación destructiva - sí accidental. Solución:
default=Falseenconfirm(). - Ecos de contraseña - visibles en pantalla. Solución:
questionary.password()oclick.prompt(hide_input=True). - Prompts sin alternativa no interactiva - rompe la automatización. Solución: cada prompt necesita un equivalente en bandera CLI.
- Unicode en terminales de Windows - problemas de visualización. Solución: Consola Rich o habilitar terminal UTF-8.
Alternativas
| Alternativa | Usar cuando | No usar cuando |
|---|---|---|
| Solo banderas CLI | Automatización scriptable | Configuración guiada por primera vez |
| Configuración basada en web | Configuración compleja | Herramienta solo de terminal |
| Archivo de configuración | Despliegues repetibles | Incorporación inicial |
Preguntas Frecuentes
¿questionary o click.prompt?
click.prompt para texto/confirmación simple. questionary para selección, casilla de verificación, autocompletado.
¿Cómo omito los prompts en CI?
if os.environ.get("CI"): usar valores predeterminados o bandera --yes / --non-interactive.
¿Cómo manejo Ctrl+C?
questionary devuelve None al cancelar. Comprueba y sal con gracia.
¿Entrada de contraseña?
questionary.password("Clave API:").ask().
¿Autocompletado?
questionary.autocomplete("Ruta:", choices=lista_archivos).ask().
¿Puedo estilizar los prompts?
questionary admite diccionarios de estilo para colores.
¿Probar CLIs interactivas?
Simular los valores de retorno de questionary.text(...).ask() en pytest.
¿Asistentes de varias páginas?
Encadenar prompts en funciones; mostrar progreso con Rich.
¿prompt_toolkit cuándo?
Construir un REPL completo o entrada con resaltado de sintaxis. Más pesado que questionary.
¿Selecciones predeterminadas?
questionary.select(..., default="FastAPI").ask().
Relacionado
- Click - confirmación/prompt incorporado
- Salida Enriquecida - salida de asistente formateada
- Configuración y Entorno - configuración post-asistente
- Mejores Prácticas CLI - interactivo vs scriptable
Versiones del 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+.