Skip to main content

Genera variantes de preguntas de opción múltiple cuyas respuestas correctas se determinan automáticamente mediante cálculo proposicional. Combina supuestos e ítems de respuesta por combinatoria, calcula la veracidad o falsedad de cada ítem según las hipótesis activas y exporta el resultado a LaTeX (AMC) o Moodle (XML vía LaTeX).

Construido sobre calcprop.

Instalación

pip install calcprop calcprop-qbank

Con soporte para el editor visual en Jupyter:

pip install "calcprop-qbank[jupyter]"

Uso rápido

from qbank import *

p = ProblemaTipo([
    "Dado que ",
    [
        Supuesto("$\\mathcal{A}$ es verdadero, ", v("A")),
        Supuesto("$\\mathcal{B}$ es verdadero, ", v("B")),
    ],
    "indique qué opción es correcta: ",
    [
        Cuestion("$\\mathcal{A}$ es verdadero.", v("A")),
        Cuestion("$\\mathcal{B}$ es verdadero.", v("B")),
    ],
])

for etiqueta, enunciado, cuestiones in p:
    print(f"Variante {etiqueta}: {enunciado}")
    for texto, correcto, activa, exp in cuestiones:
        print(f"  {'✓' if correcto else '✗'} {texto}")

Características

Generación combinatoria de variantes

ProblemaTipo toma una lista de supuestos y cuestiones (cada uno con su semántica proposicional) y genera todas las combinaciones posibles. Para cada variante calcula automáticamente qué ítems son verdaderos y cuáles falsos. Las variantes con hipótesis incoherentes o precondiciones insatisfechas se descartan.

ProblemaTipoProfe muestra todas las cuestiones para cada enunciado (sin descartar), facilitando la revisión del banco.

Preguntas multi-parte

ProblemaMultiParte genera variantes en las que cada enunciado va seguido de varios bloques de sub-preguntas independientes. Es útil para preguntas AMC con múltiples apartados o para el formato cloze de Moodle:

from qbank import *

subpreguntas = [
    SubPregunta("¿Cuál es el valor de $A$? ",
                [Cuestion("Verdadero.", v("A")),
                 Cuestion("Falso.",    ~v("A"))]),
    SubPregunta("¿Cuál es el valor de $B$? ",
                [Cuestion("Verdadero.", v("B")),
                 Cuestion("Falso.",    ~v("B"))]),
]

p = ProblemaMultiParte(
    ["Suponga que ",
     [Supuesto("$A$ es verdadero, ", v("A")),
      Supuesto("$B$ es verdadero, ", v("B"))]],
    subpreguntas,
)

Preguntas paramétricas con setup

El parámetro setup permite que los valores numéricos o simbólicos cambien en cada variante. El texto de los slots admite marcadores @variable para interpolación:

import random

def numeros():
    a = random.randint(1, 9)
    b = random.randint(1, 9)
    return {'a': a, 'b': b, 'suma': a + b}

p = ProblemaTipo(
    ["Sean $a = @a$ y $b = @b$. ",
     [Cuestion("$a + b = @suma$", True),
      Cuestion("$a + b > 10$", lambda ns: ns['a'] + ns['b'] > 10)]],
    setup=numeros,
)

Persistencia en formato JSON

Guarda y carga problemas (ProblemaTipo, ProblemaMultiParte, ProblemaVF) sin reescribir el código Python:

from qbank import load_problema, save_problema

p = load_problema('mi_problema.json')
save_problema(p, 'copia.json')

Para bancos de múltiples problemas: load_banco / save_banco.

Editor visual en Jupyter

ProblemaTipoEditor es un formulario interactivo (requiere ipywidgets) que permite construir, previsualizar y guardar problemas sin escribir código:

from qbank import ProblemaTipoEditor

editor = ProblemaTipoEditor()           # editor vacío
editor = ProblemaTipoEditor('p.json')  # cargar desde fichero

p = editor.to_problema()               # obtener el ProblemaTipo

Ver Manual.org si los widgets se muestran como texto en lugar del formulario.

Exportación a AMC y Moodle

Formato AMC (LaTeX)

Función de bajo nivel que devuelve un bloque LaTeX listo para escribir al fichero:

with open("preguntas.tex", "w") as f:
    for etiqueta, partes in p.por_partes():
        for enunciado, cuestiones in partes:
            f.write(AMCblock("MiCuestionario", etiqueta, enunciado, cuestiones))

Vista aplanada para el profesor (todas las cuestiones con marcas):

n = QuizAMCProfe("MiCuestionario", "exportaciones/", p)
print(f"{n} bloque(s) escritos")

Para preguntas multi-parte: AMC_multipart.

Formato Moodle (XML vía LaTeX)

# Vista alumno
n = QuizMoodle("MiCuestionario", "exportaciones/", p, last_choice=True)
print(f"{n} variante(s) escritas")

# Vista profe (fracciones de puntuación visibles)
QuizMoodleProfe("MiCuestionario", "exportaciones/", p)

# Con paquete LaTeX adicional y texto comodín personalizados
QuizMoodle("MiCuestionario", "exportaciones/", p,
           aux_latex=r"\usepackage{nacal-moodle}",
           last_choice_text="Las demás opciones son falsas")

QuizMoodle y QuizMoodleProfe devuelven un int con el número de variantes escritas, útil para logging en scripts de build.

Para preguntas ProblemaVF: QuizVFMoodle.

Exportación a código Python editable

save_problema_py genera un fichero .py con la definición del problema como listas editables, tanto para ProblemaTipo como para ProblemaMultiParte:

from qbank import save_problema_py

save_problema_py(p, 'mi_problema.py')

El fichero resultante puede abrirse con cualquier editor, modificarse y ejecutarse directamente con Python.

Documentación

  • CalcPropQuiz.org — código fuente comentado del módulo _quiz, _json y _widgets.
  • CalcPropExport.org — código fuente comentado del módulo _export.
  • Manual.org — manual de usuario con ejemplos.

Los ficheros Python se generan desde los .org mediante org-babel-tangle.

Tests

pytest

Autoría y licencia

Copyright (C) 2020-2026 Andrés Bujosa, Marcos Bujosa (_quiz)
Copyright (C) 2020-2026 Marcos Bujosa (_export, _json, _widgets)

This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

See the LICENSE file for details.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

calcprop_qbank-0.4.0.tar.gz (35.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

calcprop_qbank-0.4.0-py3-none-any.whl (37.6 kB view details)

Uploaded Python 3

File details

Details for the file calcprop_qbank-0.4.0.tar.gz.

File metadata

  • Download URL: calcprop_qbank-0.4.0.tar.gz
  • Upload date:
  • Size: 35.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.2

File hashes

Hashes for calcprop_qbank-0.4.0.tar.gz
Algorithm Hash digest
SHA256 cb9eadd8a32c9f6bb7fd2117bc8fbfb94de137beceba003800b2da4336f83b37
MD5 6699d4439e35d2e0fd307a8722f98b8d
BLAKE2b-256 8c7e4fd93e2e0b42ad92834fbc0bb5fb85c4bf925e98848b141d0f0c6c2ea1c2

See more details on using hashes here.

File details

Details for the file calcprop_qbank-0.4.0-py3-none-any.whl.

File metadata

  • Download URL: calcprop_qbank-0.4.0-py3-none-any.whl
  • Upload date:
  • Size: 37.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.2

File hashes

Hashes for calcprop_qbank-0.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 885dc0b0a807626539c32f1b1579fccd1bce2d36c8d8a00138c02756ced95a4d
MD5 175e1ae7b4a536b575e7dfd2f18b8565
BLAKE2b-256 08cf63dbb297d7a4001d661b2a9cd1f5cf87ebbc48a2efbaaeb0b82d530f095f

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

0.4.0 This release

2 files

0.3.2

2 files

0.3.1

2 files

0.3.0

2 files

0.2.2

2 files

0.2.1

2 files

0.2.0

2 files

0.1.3

2 files

0.1.2

2 files

0.1.1

2 files

0.1.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page