Digite funções com PythonTeX e execute-as no console posteriormente

Digite funções com PythonTeX e execute-as no console posteriormente

Eu tenho o seguinte código-fonte python:

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

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

A primeira definição de função dá uma dica sobre a implementação e as chamadas abaixo mostram uso/saída exemplares.

Quero compor isso da seguinte maneira (para que as pessoas possam copiar e colar a implementação e ver alguns resultados ao vivo):

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

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

Não consegui criar isso 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}

Isso me dá

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

Odocumentaçãomenciona sessões, onde o código é executado em paralelo, então coloco esses trechos de código explicitamente na mesma sessão (embora, por padrão, ambos sejam executados default).

Eu definitivamente preciso de umPythonTeXsolução. Alguma ideia?

Responder1

O código do console e o código normal têm cada um seu próprioseparado defaultsessões. Todos os comandos/ambientes que começam com pyconsão executados de forma completamente separada daqueles que começam com py. Não há sobreposição entre eles.

Um recurso para fazer o que quiserfoi solicitadoe será implementado em uma próxima versão do PythonTeX. Enquanto isso, você provavelmente poderá fazer o que quiser com esta solução alternativa,copiado dessa solicitação de recurso.

\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}

informação relacionada