Faça os blocos de código Python formatarem seus resultados como tabelas organizacionais

Sep 21 2020

O contexto

Em #+BEGIN_SRCblocos de código cujo idioma é cppou sh, o caractere de tabulação é usado como um delimitador para células ao usar o :results tableargumento de cabeçalho (consulte os exemplos abaixo)

#+begin_src cpp :results replace output table
#include <iostream>

int main() {
  std::cout << "a\ta\nbbbbb\tbbbbb" << std::endl;
  return 0;
}
#+end_src

#+RESULTS:
| a     | a     |
| bbbbb | bbbbb |
#+begin_src sh :results replace output table
printf "%s\t%s\n" "a" "a" "bbbbbb" "bbbbbb"
#+end_src

#+RESULTS:
| a      | a      |
| bbbbbb | bbbbbb |

No entanto, este mesmo comportamento não está presente em pythonblocos de código (veja abaixo)

#+begin_src python :results replace output table
print("a\ta\nbbbbb\tbbbbb")
#+end_src

#+RESULTS:
: a a
: bbbbb bbbbb

A questão

Como posso fazer com que a saída de pythonblocos de código seja exibida como tabelas organizacionais. Não é usar esses argumentos de cabeçalho e fazer a saída conter caracteres de tabulação o suficiente para #+RESULTSser formatado como uma tabela organizacional?

Respostas

9 serycjon Sep 21 2020 at 17:48

Você pode gerar tabelas organizacionais formatadas, retornando uma lista de listas como segue (aviso no: saída de resultados):

#+begin_src python :results replace table
return (('a', 'a'), None, ('bbbbb', 'bbbbb'))
#+end_src

#+RESULTS:
| a     | a     |
|-------+-------|
| bbbbb | bbbbb |

uma linha Nenhum cria uma linha separadora.

Aqui estão alguns outros exemplos usando :results output

#+BEGIN_SRC python :results output table
print([['Number', 'Number * 10'], None, [1, 10], [2, 20]])
#+END_SRC

#+RESULTS:
| Number | Number * 10 |
|--------+-------------|
|      1 |          10 |
|      2 |          20 |
#+BEGIN_SRC python :results value table
return [['Number', 'Number * 10'], None, [1, 10], [2, 20]]
#+END_SRC

#+RESULTS:
| Number | Number * 10 |
|--------+-------------|
|      1 |          10 |
|      2 |          20 |

Observe que, ao usar :results output, um único printé incluído no #+RESULTSbloco de código.

#+BEGIN_SRC python :results output table
for i in range(5):
  print([i, i**10])
#+END_SRC

#+RESULTS:
| 0 | 0 |