Можно ли комбинировать магию в IPython / Jupyter? - PullRequest
0 голосов
/ 08 ноября 2018

Иногда вы хотите использовать несколько магий одновременно. Теперь я знаю, что вы можете использовать

%%time
%%bash
ls 

Но когда я делаю свои собственные команды, эта цепочка не работает ...

from IPython.core.magic import register_cell_magic

@register_cell_magic
def accio(line, cell):
    print('accio')
    exec(cell)

приводит к ошибке при использовании

%%accio
%%bash
ls

Что я должен использовать вместо exec?

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Вы должны применить специальные преобразования IPython, чтобы запустить вложенную магию с ячейкой, , как %%time magic :

@register_cell_magic
def accio(line, cell):
    ipy = get_ipython()
    expr = ipy.input_transformer_manager.transform_cell(cell)
    expr_ast = ipy.compile.ast_parse(expr)
    expr_ast = ipy.transform_ast(expr_ast)
    code = ipy.compile(expr_ast, '', 'exec')
    exec(code)

или просто позвоните run_cell:

@register_cell_magic
def accio(line, cell):
    get_ipython().run_cell(cell)

результат:

In [1]: %%accio
   ...: %%time
   ...: %%bash
   ...: date
   ...:
accio
Wed Nov 14 17:41:55 CST 2018
CPU times: user 1.42 ms, sys: 4.21 ms, total: 5.63 ms
Wall time: 9.64 ms
0 голосов
/ 14 ноября 2018

В исходном коде IPython они почти всегда используют класс для создания магических операторов, потому что они могут содержать значения, и я думаю, это то, что вы ищете.

Проверьте этот исходный код, чтобы увидеть примеры .

...