Views
No views yet
https://huggingface.co/datasets/tepirale/claude-reasoning-8.7k-es
1# Repo de HF del modelo fusionado, o ruta local a la carpeta del merge.
2MODEL_PATH = "tepirale/gemma-4-E2B-reasoning-es"
3
4MAX_SEQ_LENGTH = 8192
5LOAD_IN_4BIT = False # True para ahorrar VRAM (ligera pérdida de calidad)
6
7from unsloth import FastModel
8
9model, tokenizer = FastModel.from_pretrained(
10 model_name = MODEL_PATH,
11 max_seq_length = MAX_SEQ_LENGTH,
12 dtype = None,
13 load_in_4bit = LOAD_IN_4BIT,
14)
15
16# Habilita el modo de inferencia rápida de Unsloth (no-op si no aplica)
17try:
18 FastModel.for_inference(model)
19except Exception as e:
20 print("for_inference no disponible:", e)1from transformers import TextStreamer
2
3# El tokenizer de Gemma 4 es un Gemma4Processor (images va primero en __call__);
4# para tokenizar texto usamos el tokenizer de texto subyacente.
5_tok = getattr(tokenizer, "tokenizer", tokenizer)
6
7def chat(user_msg, system="Eres un asistente útil.", history=None,
8 enable_thinking=True, max_new_tokens=2048, stream=True):
9 """history: lista opcional de turnos previos [{'role':'user'/'assistant','content':...}]
10 (sin pensamientos; la doc recomienda no reinyectar thoughts en el historial)."""
11 messages = [{"role": "system", "content": system}]
12 if history:
13 messages += history
14 messages.append({"role": "user", "content": user_msg})
15
16 # La PLANTILLA coloca el <|think|> en el formato correcto (no lo ponemos a mano)
17 text = tokenizer.apply_chat_template(
18 messages, tokenize=False, add_generation_prompt=True,
19 enable_thinking=enable_thinking,
20 ).removeprefix("<bos>")
21
22 inputs = _tok(text, return_tensors="pt").to(model.device)
23 streamer = TextStreamer(_tok, skip_prompt=True) if stream else None
24 out = model.generate(
25 **inputs,
26 max_new_tokens=max_new_tokens,
27 do_sample=True, temperature=1.0, top_p=0.95, top_k=64,
28 streamer=streamer,
29 )
30 resp = _tok.decode(out[0][inputs["input_ids"].shape[-1]:], skip_special_tokens=False)
31 try:
32 return tokenizer.parse_response(resp) # separa {'thinking', 'content'}
33 except Exception:
34 return resp1res = chat(
2 "Un triángulo tiene lados de longitud 5, 12 y 13. ¿Es un triángulo rectángulo? ¿Cuál es su área?",
3 system="Eres un tutor de informática. Explica los conceptos con claridad y ejemplos.",
4)
5
6print("\n\n=== parse_response ===")
7print(res) # si el fine-tune funcionó, 'thinking' debe estar en español
8
9"""
10<|channel>thought
11El usuario me presenta un problema de geometría que involucra la identificación de un triángulo rectángulo y el cálculo de su área. La primera pregunta es si es un triángulo rectángulo. La forma más rápida de verificar esto es usar el teorema de Pitágoras: a^2 + b^2 = c^2. En este caso, 5^2 + 12^2 = 25 + 144 = 169, y 13^2 = 169. Como 5^2 + 12^2 = 13^2, el triángulo es un triángulo rectángulo.
12
13La segunda pregunta es cuál es su área. La fórmula del área de un triángulo cuando se conoce uno de sus lados y los otros dos es (base * altura) / 2. En un triángulo rectángulo, los dos catetos (5 y 12) pueden servir como base y altura. Por lo tanto, el área es (5 * 12) / 2 = 60 / 2 = 30.
14
15Deberé presentar el teorema de Pitagó en primer lugar como la herramienta para la verificación, luego la aplicación de la fórmula del área. Esto proporciona una solución estructurada y fácil de seguir.<channel|>Sí, es un triángulo rectángulo.
16
17Verificamos el teorema de Pitágoras:
185² + 12² = 25 + 144 = 169
1913² = 169
20Como 5² + 12² = 13² (25 + 144 = 169), el triángulo es un triángulo rectángulo.
21
22La fórmula del área de un triángulo cuando se conocen los dos catetos es (base * altura) / 2. En un triángulo rectángulo, los catetos (5 y 12) pueden ser la base y la altura.
23
24Área = (5 * 12) / 2 = 60 / 2 = 30.
25
26El área del triángulo es 30 unidades cuadradas.<turn|>
27
28
29=== parse_response ===
30{'content': 'Sí, es un triángulo rectángulo.\n\nVerificamos el teorema de Pitágoras:\n5² + 12² = 25 + 144 = 169\n13² = 169\nComo 5² + 12² = 13² (25 + 144 = 169), el triángulo es un triángulo rectángulo.\n\nLa fórmula del área de un triángulo cuando se conocen los dos catetos es (base * altura) / 2. En un triángulo rectángulo, los catetos (5 y 12) pueden ser la base y la altura.\n\nÁrea = (5 * 12) / 2 = 60 / 2 = 30.\n\nEl área del triángulo es 30 unidades cuadradas.', 'role': 'assistant', 'thinking': 'El usuario me presenta un problema de geometría que involucra la identificación de un triángulo rectángulo y el cálculo de su área. La primera pregunta es si es un triángulo rectángulo. La forma más rápida de verificar esto es usar el teorema de Pitágoras: a^2 + b^2 = c^2. En este caso, 5^2 + 12^2 = 25 + 144 = 169, y 13^2 = 169. Como 5^2 + 12^2 = 13^2, el triángulo es un triángulo rectángulo.\n\nLa segunda pregunta es cuál es su área. La fórmula del área de un triángulo cuando se conoce uno de sus lados y los otros dos es (base * altura) / 2. En un triángulo rectángulo, los dos catetos (5 y 12) pueden servir como base y altura. Por lo tanto, el área es (5 * 12) / 2 = 60 / 2 = 30.\n\nDeberé presentar el teorema de Pitagó en primer lugar como la herramienta para la verificación, luego la aplicación de la fórmula del área. Esto proporciona una solución estructurada y fácil de seguir.'}
31"""1
2_ = chat(
3 "dame una conversacion en español tipo 'usuario' 'asistente' en formato lista de JSON, la lista debe contener 500 json",
4 enable_thinking=True, #False
5 max_new_tokens=88256,
6)
7
8"""
9<|channel>thought
10El usuario quiere una conversación larga en español con 500 objetos JSON, en el formato 'usuario'/'asistente'. Esto es un desafío de longitud y coherencia.
11
12Para mantener 500 objetos JSON, necesito que cada uno sea muy corto, quizás 30-50 tokens, para que la lista no sea excesivamente pesada. La conversación debe ser lo suficientemente variada como para alcanzar esa longitud sin caer en la repetición.
13
14Ideas para la variedad:
151. Preguntas informativas (cómo hacer algo, qué es)
162. Solicitudes de formato (lista, párrafo, código)
173. Opiniones o preferencias
184. Tareas específicas (resumir, traducir, generar)
195. Interacción de seguimiento (profundizar, cambiar de tema)
20
21Necesito una estructura que se sienta como una conversación real, no como una lista de preguntas y respuestas. El flujo debería ser: usuario -> asistente -> usuario -> asistente -> usuario... y luego una resolución o un cambio de tema.
22
23Mantendré los turnos cortos para alcanzar los 500 objetos JSON. Cada par de objetos debería ser una micro-interacción.
24
25También necesito asegurarme de que el español sea natural, no robado de una fuente. Evitaré estructuras de traducción directa y me centraré en la naturalidad del diálogo.
26
27Estructura de salida: una lista de 500 objetos JSON. Cada objeto debe tener 'usuario' y 'asistente' como claves.<channel|>```json
28[
29 {"usuario": "¿Cómo se dice 'I am happy' en español?", "asistente": "Estoy feliz."},
30 {"usuario": "¿Cuál es la capital de Francia?", "asistente": "París."},
31 {"usuario": "Dame una lista de compras.", "asistente": "Aquí tienes una lista."},
32 {"usuario": "Traduce 'The cat is on the mat'", "asistente": "El gato está en la alfombra."},
33 {"usuario": "Hazme una pregunta de conocimiento general.", "asistente": "¿Cuál es el océano más grande del mundo?"},
34 {"usuario": "Dame un resumen de 50 palabras.", "asistente": "Aquí tienes un resumen."},
35 {"usuario": "Dame un ejemplo de código Python.", "asistente": "Claro, aquí tienes código."},
36 {"usuario": "Dime tu opinión sobre las películas de acción.", "asistente": "Son divertidas pero a veces demasiado explosivas."},
37 {"usuario": "¿Qué es la fotosíntesis?", "asistente": "Es el proceso por el cual las plantas convierten la luz solar en alimento."},
38 {"usuario": "Dame 10 datos curiosos.", "asistente": "Aquí tienes 10 datos."},
39 {"usuario": "Dime cómo pedir ayuda en inglés.", "asistente": "Can you help me with...?"},
40 {"usuario": "Dame un consejo para estudiar.", "asistente": "Organiza tu tiempo."},
41 {"usuario": "¿Cuál es la diferencia entre 'they' y 'them'?", "asistente": "They son sujetos, them son objetos."},
42 {"usuario": "Dame una receta de pasta.", "asistente": "Aquí tienes una receta."},
43 {"usuario": "Crea una lista de verificación para mi viaje.", "asistente": "Aquí tienes."},
44 {"usuario": "Dame un ejemplo de cómo corregir un error de gramática.", "asistente": "El error es 'is' en lugar de 'are'."},
45 {"usuario": "Dime algo interesante sobre tu día.", "asistente": "Estoy procesando información ahora."},
46 {"usuario": "¿Qué opinas de los viajes?", "asistente": "Son maravillosos, pero planificar es importante."},
47 {"usuario": "Dame un reto de creatividad.", "asistente": "Escribe una historia corta."},
48 {"usuario": "Ayúdame a practicar español.", "asistente": "Empecemos con un tema."},
49 {"usuario": "¿Cuál es tu hobby?", "asistente": "Procesando información."},
50 {"usuario": "Dame un consejo sobre la productividad.", "asistente": "Usa listas."},
51 {"usuario": "¿Cómo se dice 'I need help' en inglés?", "asistente": "Can you help me with...?"},
52 {"usuario": "Dame un ejemplo de cómo usar 'although'", "asistente": "Aunque..."},
53 {"usuario": "Dime algo sobre la comida mexicana.", "asistente": "Es deliciosa y diversa."},
54 {"usuario": "¿Cuál es tu opinión sobre los deportes?", "asistente": "Son emocionantes pero hay que ser respetuosos."},
55 {"usuario": "Dame un consejo sobre la inteligencia emocional.", "asistente": "Escucha activamente."},
56 {"usuario": "Traduce 'It was a beautiful day'", "asistente": "Fue un día hermoso."},
57 {"usuario": "Dame un ejemplo de cómo usar 'although'", "asistente": "Aunque..."},
58 {"usuario": "¿Qué es la gravedad?", "asistente": "Es la fuerza de atracción entre objetos con masa."},
59 {"usuario": "Dame un consejo sobre la paciencia.", "asistente": "Tómate tu tiempo."},
60 {"usuario": "Dime algo sobre los perros.", "asistente": "Son muy leales."},
61 {"usuario": "Dame un consejo sobre el estrés.", "asistente": "Respira."},
62 {"usuario": "¿Cómo se dice 'What time is it?' en inglés?", "asistente": "¿Qué hora es?"},
63 {"usuario": "Dame un ejemplo de cómo usar 'if'", "asistente": "Si..."},
64 {"usuario": "Dime algo sobre el espacio.", "asistente": "Es vasto y misterioso."},
65 {"usuario": "Dame un consejo sobre la tecnología.", "asistente": "Usa la tecnología con moderación."},
66 {"usuario": "Ayúdame a practicar español.", "asistente": "Empecemos con un tema."},
67 {"usuario": "¿Cuál es tu opinión sobre los libros de ciencia ficción?", "asistente": "Son muy entretenidos."},
68 {"usuario": "Dame un consejo sobre la salud.", "asistente": "Duerme bien."},
69 {"usuario": "Dime algo sobre la cultura japonesa.", "asistente": "Es muy respetuosa."},
70 {"usuario": "Dame un consejo sobre la cocina.", "asistente": "Experimenta."},
71 {"usuario": "Ayúdame a practicar español.", "asistente": "Empecemos con un tema."},
72 {"usuario": "¿Cuál es tu opinión sobre las redes sociales?", "asistente": "Son útiles pero pueden ser agotadoras."},
73 {"usuario": "Dame un consejo sobre el dinero.", "asistente": "Sé paciente."},
74 {"usuario": "Dime algo sobre la historia de México.", "asistente": "Es rica y colorida."},
75 {"usuario": "Dame un consejo sobre el tiempo libre.", "asistente": "Haz cosas que te gusten."},
76 {"usuario": "Ayúdame a practicar español.", "asistente": "Empecemos con un tema."},
77 {"usuario": "¿Cuál es tu opinión sobre los deportes?", "asistente": "Son emocionantes pero hay que ser respetuosos."},
78 {"usuario": "Dame un consejo sobre la salud mental.", "asistente": "Habla de tus sentimientos."},
79 {"usuario": "Dime algo sobre la comida italiana.", "asistente": "Es deliciosa y variada."},
80 {"usuario": "Dame un consejo sobre la vida.", "asistente": "Sé amable contigo mismo."},
81 {"usuario": "¿Cómo se dice 'It was a beautiful day' en inglés?", "asistente": "Fue un día hermoso."},
82 {"usuario": "Dame un ejemplo de cómo usar 'although'", "asistente": "Aunque..."},
83 {"usuario": "Dime algo sobre la tecnología.", "asistente": "Úsala con moderación."},
84 {"usuario": "Dame un consejo sobre la vida.", "asistente": "Sé amable contigo mismo."},
85 {"usuario": "Ayúdame a practicar español.", "asistente": "Empecemos con un tema."},
86 {"usuario": "¿Cuál es tu opinión sobre los viajes?", "asistente": "Son maravillosos, pero planificar es importante."},
87 {"usuario": "Dame un consejo sobre la vida.", "asistente": "Sé paciente."},
88 {"usuario": "Dime algo sobre la comida mexicana.", "asistente": "Es deliciosa y diversa."},
89 {"usuario": "Dame un consejo sobre la vida.", "asistente": "Sé amable contigo mismo."},
90 {"usuario": "Ayúdame a practicar español.", "asistente": "Empecemos con un tema."},
91 {"usuario": "¿Cuál es tu opinión sobre los deportes?", "asistente": "Son emocionantes pero hay que ser respetuosos."},
92 {"usuario": "Dame un consejo sobre la salud mental.", "asistente": "Habla de tus sentimientos."},
93 {"usuario": "Dame un consejo sobre la vida.", "asistente": "Sé amable contigo mismo."},
94 {"usuario": "Dime algo sobre la tecnología.", "asistente": "Úsala con moderación."},
95 {"usuario": "Ayúdame a practicar español.", "asistente": "Empecemos con un tema."},
96 {"usuario": "¿Cuál es tu opinión sobre las películas de acción?", "asistente": "Son divertidas pero a veces demasiado explosivas."},
97 {"usuario": "Dame un consejo sobre la vida.", "asistente": "Sé amable contigo mismo."},
98 {"usuario": "Dime algo sobre la comida japonesa.", "asistente": "Es deliciosa y variada."},
99 {"usuario": "Dame un consejo sobre la vida.", "asistente": "Sé paciente."},
100 {"usuario": "Ayúdame a practicar español.", "asistente": "Empecemos con un tema."},
101 {"usuario": "¿Cuál es tu opinión sobre los viajes?", "asistente": "Son maravillosos, pero planificar es importante."},
102 {"usuario": "Dame un consejo sobre la vida.", "asistente": "Sé amable contigo mismo."},
103 {"usuario": "Dime algo sobre la comida italiana.", "asistente": "Es deliciosa y variada."},
104 {"usuario": "Dame un consejo sobre la vida.", "asistente": "Sé paciente."},
105 {"usuario": "Ayúdame a practicar español.", "asistente": "Empecemos con un tema."},
106 {"usuario": "¿Cuál es tu opinión sobre los deportes?", "asistente": "Son emocionantes pero hay que ser respetuosos."},
107 {"usuario": "Dame un consejo sobre la vida.", "asistente": "Sé amable contigo mismo."},
108 {"usuario": "Dime algo sobre la tecnología.", "asistente": "Úsala con moderación."},
109 {"usuario": "Ayúdame a practicar español.", "asistente": "Empecemos con un tema."},
110 {"usuario": "¿Cuál es tu opinión sobre las películas de acción?", "asistente": "Son divertidas pero a veces demasiado explosivas."},
111 {"usuario": "Dame un consejo sobre la vida.", "asistente": "Sé amable contigo mismo."},
112 {"usuario": "Dime algo sobre la comida mexicana.", "asistente": "Es deliciosa y diversa."},
113 {"usuario": "Dame un consejo sobre la vida.", "asistente": "Sé paciente."},
114 {"usuario": "Ayúdame a practicar español.", "asistente": "Empecemos con un tema."},
115 {"usuario": "¿Cuál es tu opinión sobre los viajes?", "asistente": "Son maravillosos, pero planificar es importante."},
116 {"usuario": "Dame un consejo sobre la vida.", "asistente": "Sé amable contigo mismo."},
117 {"usuario": "Dime algo sobre la comida italiana.", "asistente": "Es deliciosa y variada."},
118 {"usuario": "Dame un consejo sobre la vida.", "asistente": "Sé paciente."},
119 {"usuario": "Ayúdame a practicar español.", "asistente": "Empecemos con un tema."}
120]
121```<turn|>
122
123"""1a= '''
2import datetime
3
4class Producto:
5 """Clase base para representar un producto en el sistema."""
6 def __init__(self, id_producto, nombre, precio, cantidad):
7 self.id_producto = id_producto
8 self.nombre = nombre
9 self.precio = float(precio)
10 self.cantidad = int(cantidad)
11
12 def actualizar_cantidad(self, cantidad):
13 self.cantidad += int(cantidad)
14
15 def calcular_valor_inventario(self):
16 # Usamos LaTeX para la representación matemática, aunque en código es simple:
17 # Valor = Precio \times Cantidad
18 return self.precio * self.cantidad
19
20 def obtener_info(self):
21 return f"{self.nombre} | Precio: ${self.precio:.2f} | Stock: {self.cantidad}"
22
23
24class Inventario:
25 """Clase que gestiona un conjunto de productos."""
26 def __init__(self):
27 self.productos = {}
28
29 def agregar_producto(self, producto):
30 self.productos[producto.id_producto] = producto
31 print(f"Producto '{producto.nombre}' añadido con éxito.")
32
33 def eliminar_producto(self, id_producto):
34 if id_producto in self.productos:
35 eliminado = self.productos.pop(id_producto)
36 print(f"Producto '{eliminado.nombre}' eliminado del inventario.")
37 else:
38 print("Error: ID de producto no encontrado.")
39
40 def buscar_producto(self, termino):
41 resultados = []
42 for p in self.productos.values():
43 if termino.lower() in p.nombre.lower() or termino == p.id_producto:
44 resultados.append(p)
45 return resultados
46
47 def mostrar_inventario(self):
48 print("\n--- INVENTARIO ACTUAL ---")
49 if not self.productos:
50 print("El inventario está vacío.")
51 return False
52
53 for p in self.productos.values():
54 print(p.obtener_info())
55 return True
56
57 def valor_total_inventario(self):
58 total = 0.0
59 for p in self.productos.values():
60 total += p.calcular_valor_inventario()
61 return total
62
63
64def menu():
65 """Muestra el menú principal en consola."""
66 print("\n=============================")
67 print(" SISTEMA DE INVENTARIO V1")
68 print("=============================")
69 print("1. Agregar producto")
70 print("2. Eliminar producto")
71 print("3. Buscar producto")
72 print("4. Mostrar todo el inventario")
73 print("5. Ver valor total del inventario")
74 print("6. Salir")
75
76
77def main():
78 """Función principal que ejecuta el sistema."""
79 mi_inventario = Inventario()
80
81 # Datos de prueba iniciales
82 mi_inventario.agregar_producto(Producto("P001", "Laptop Gamer", 1200.50, 15))
83 mi_inventario.agregar_producto(Producto("P002", "Mouse Inalámbrico", 45.00, 50))
84 mi_inventario.agregar_producto(Producto("P003", "Teclado Mecánico", 85.50, 30))
85
86 while True:
87 menu()
88 opcion = input("\nSeleccione una opción (1-6): ")
89
90 if opcion == "1":
91 id_p = input("Ingrese ID del producto: ")
92 nombre = input("Ingrese nombre: ")
93 precio = input("Ingrese precio: ")
94 cantidad = input("Ingrese cantidad inicial: ")
95 mi_inventario.agregar_producto(Producto(id_p, nombre, precio, cantidad))
96
97 elif opcion == "2":
98 id_p = input("Ingrese ID del producto a eliminar: ")
99 mi_inventario.eliminar_producto(id_p)
100
101 elif opcion == "3":
102 termino = input("Ingrese nombre o ID a buscar: ")
103 resultados = mi_inventario.buscar_producto(termino)
104 if resultados:
105 print("\nResultados encontrados:")
106 for r in resultados:
107 print(r.obtener_info())
108 else:
109 print("No se encontraron coincidencias.")
110
111 elif opcion == "4":
112 mi_inventario.mostrar_inventario()
113
114 elif opcion == "5":
115 total = mi_inventario.valor_total_inventario()
116 print(f"\nEl valor total del inventario es: ${total:.2f}")
117
118 elif opcion == "6":
119 fecha = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
120 print(f"\nSaliendo del sistema a las {fecha}. ¡Hasta luego!")
121 break
122 else:
123 print("Opción inválida. Intente de nuevo con un número del 1 al 6.")
124
125if __name__ == "__main__":
126 main()
127
128
129Explicame el codigo no entiendo
130'''
131_ = chat(
132 a,
133 enable_thinking=True, #False
134 max_new_tokens=88256,
135)
136
137"""
138<|channel>thought
139The user has provided a Python class structure for a simple inventory system and asked for an explanation. They explicitly stated they don't understand the code. I need to break it down logically:
140
1411. **`Producto` class**: This is the base class. It holds core attributes (id, name, price, quantity) and three methods: `actualizar_cantidad` (simple addition), `calcular_valor_inventario` (multiplication), and `obtener_info` (formatted string). The docstring is a bit heavy with LaTeX, which is unnecessary for this simple class but shows an intent to document the math.
1422. **`Inventario` class**: This class manages the collection of `Producto` objects. It uses a dictionary (`self.productos`) for efficient lookup by ID. The methods (`agregar_producto`, `eliminar_producto`, `buscar_producto`, `mostrar_inventario`, `valor_total_inventario`) handle the CRUD operations and calculations.
1433. **`menu()` function**: This is the main user interface. It prints a static menu and handles user input by matching the choice to the appropriate method in the `main()` function.
1444. **`main()` function**: This is the entry point. It initializes the `Inventario` and populates it with test data. The `while True:` loop runs the `menu()` and uses `if/elif/else` to control the flow. The input handling is a bit verbose (checking if the input is a valid integer for options 1-5, handling '6' for exit).
1455. **`if __name__ == "__main__":`**: This standard Python construct ensures that `main()` is only executed when the script is run directly, not when imported as a module.
146
147I will explain each class and method clearly, focusing on *what* the code does, not just *how* it does it. I'll also point out the structure (inheritance, dictionary usage) and the flow of execution.<channel|>Este es un sistema de inventario simple escrito en Python. Está diseñado para ser ejecutado directamente desde la línea de comandos.
148
149### 1. La clase base `Producto`
150
151Esta es la clase fundamental. Todo artículo en el sistema heredará sus características:
152
153- **`__init__`**: Crea un objeto `Producto` con cuatro atributos: `id_producto` (string), `nombre` (string), `precio` (float), `cantidad` (integer). El constructor convierte el precio y la cantidad de string a float e int, asegurando que los cálculos posteriores sean correctos.
154- **`actualizar_cantidad(self, cantidad)`**: Suma la nueva cantidad al stock actual.
155- **`calcular_valor_inventario(self)`**: Devuelve el precio multiplicado por la cantidad. Esta es la operación matemática central.
156- **`obtener_info(self)`**: Devuelve una cadena de formato legible que muestra el nombre, el precio y el stock.
157
158### 2. La clase `Inventario`
159
160Esta clase es el gestor del inventario.
161
162- **`__init__`**: Inicializa un diccionario vacío (`self.productos`) donde se almacenarán los objetos `Producto`. Usar un diccionario permite buscar, agregar o eliminar productos de forma rápida por su ID.
163- **`agregar_producto(self, producto)`**: Almacena el objeto `Producto` en el diccionario usando su ID como clave.
164- **`eliminar_producto(self, id_producto)`**: Verifica si el ID existe. Si sí, lo elimina del diccionario y devuelve el objeto eliminado. Si no, imprime un mensaje de error.
165- **`buscar_producto(self, termino)`**: Itera sobre todos los valores del diccionario y devuelve una lista de productos que coinciden con el `termino` (ignorando mayúsculas/minúsculas).
166- **`mostrar_inventario(self)`**: Recorre el diccionario y llama a `p.obtener_info()` para cada producto, imprimiendo la información de forma ordenada.
167- **`valor_total_inventario(self)`**: Suma el resultado de `p.calcular_valor_inventario()` para todos los productos.
168
169### 3. La función `menu()`
170
171Esta es la interfaz de usuario en consola. Simplemente imprime un menú fijo y devuelve la entrada del usuario.
172
173### 4. La función **`main()`**
174
175Esta es la parte que controla el flujo del programa.
176
177- **Inicialización**: Crea un objeto `Inventario()` y lo llena con datos de prueba.
178- **Bucle principal**: `while True:` ejecuta `menu()` y lee la entrada del usuario.
179- **`if/elif/else`**: Compara la entrada del usuario con los números del menú y llama a la función de gestión del inventario correspondiente.
180- **Manejo de entrada**: Verifica si la opción es un número y si es un entero. Maneja la salida '6' para salir del programa.
181- **Llamadas a métodos**: Cada opción llama a un método del `Inventario` que a su vez crea un objeto `Producto` y lo pasa.
182
183### 5. **`if __name__ == "__main__":`**
184
185Esta línea estándar de Python hace que el código `main()` se ejecute solo cuando el archivo se ejecuta directamente (no cuando se importa como un módulo). Esto es una buena práctica para evitar que el código de prueba se ejecute accidentalmente.
186
187### Resumen del flujo
188
1891. Se crea un objeto `Inventario`.
1902. Se añaden tres objetos `Producto` de prueba al inventario.
1913. El programa entra en un bucle infinito que muestra el menú.
1924. El usuario ingresa un número.
1935. El código `if/elif/else` dirige la entrada a la función de gestión del inventario adecuada.
1946. Los métodos de `Inventario` se ejecutan, interactúan con los objetos `Producto` y muestran los resultados.
1957. El bucle continúa hasta que el usuario ingresa '6'.
1968. El programa termina.<turn|>
197"""https://huggingface.co/NickyNicky