Escriba funciones con PythonTeX y luego ejecútelas en la consola

Escriba funciones con PythonTeX y luego ejecútelas en la consola

Tengo el siguiente código fuente de Python:

def modulo(a, n):
    return a % n

print(modulo(3, 10))
print(modulo(10, 10))
print(modulo(11, 10))

La primera definición de función brinda una pista sobre la implementación y las llamadas a continuación muestran un uso/resultado ejemplar.

Quiero componer esto de la siguiente manera (para que la gente pueda copiar y pegar la implementación y ver algunos resultados en vivo):

def modulo(a, n):
    return a % n

>>> print(modulo(3, 10))
3
>>> print(modulo(10, 10))
0
>>> print(modulo(11, 10))
1

No pude crear esto usando PythonTeX.

\begin{pyblock}[mysession][]
def modulo(a, n):
    return a % n

\end{pyblock}

\begin{pyconsole}[mysession][]
print(modulo(3, 10))
print(modulo(10, 10))
print(modulo(11, 10))

\end{pyconsole}

esto me da

def modulo(a, n):
    return a % n

>>> print(modulo(3, 10))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'modulo' is not defined
>>> print(modulo(10, 10))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'modulo' is not defined
>>> print(modulo(11, 10))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'modulo' is not defined

Eldocumentaciónmenciona sesiones, donde el código se ejecuta en paralelo, por lo que coloco esos fragmentos de código explícitamente en la misma sesión (aunque, de forma predeterminada, ambos se ejecutan default).

Definitivamente necesito unPythonTeXsolución. ¿Algunas ideas?

Respuesta1

El código de consola y el código normal tienen cada uno su propioseparado defaultsesiones. Todos los comandos/entornos que comienzan con pyconse ejecutan de forma completamente independiente de aquellos que comienzan con py. No hay superposición entre ellos.

Una característica para hacer lo que quierasha sido solicitadoy se implementará en una próxima versión de PythonTeX. Mientras tanto, probablemente puedas hacer lo que quieras con esta solución,copiado de esa solicitud de función.

\documentclass{article}

\usepackage{pythontex}

\newenvironment{pyconcodeblock}%
 {\VerbatimEnvironment
  \begin{VerbatimOut}{temp.py}}%
 {\end{VerbatimOut}%
  \pyconc{exec(compile(open('temp.py', 'rb').read(), 'temp.py', 'exec'))}%
  \inputpygments{python}{temp.py}}

\begin{document}

\begin{pyconcodeblock}
def foo(x):
    return 2*x
\end{pyconcodeblock}

\begin{pyconsole}
x = 10
foo(x)
\end{pyconsole}

\end{document}

información relacionada