Проблема с пространством имен с магией ячейки jupyter - PullRequest
0 голосов
/ 13 июля 2020

Я пытаюсь создать ячейку magi c в jupyter, которая будет выполнять ячейку в чистом пространстве имен.

Я определяю magi c как:

from IPython.core.magic import register_cell_magic

@register_cell_magic
def check1(line, cell):

    globals = dict()
    locals = dict()
    exec(cell, globals, locals)

то я бы использовал его в ячейке как:

%%check1

import numpy as np

def f(x):
    return np.sqrt(x)

f(4)

и от этого я ожидал бы увидеть ответ 2.0. Однако я получаю эту ошибку:

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-28-0f77516a515f> in <module>
----> 1 get_ipython().run_cell_magic('check1', '', '\nimport numpy as np\n\n\ndef f(x):\n    return np.sqrt(x)\n\nf(4)\n')

~/opt/anaconda3/lib/python3.7/site-packages/IPython/core/interactiveshell.py in run_cell_magic(self, magic_name, line, cell)
   2360             with self.builtin_trap:
   2361                 args = (magic_arg_s, cell)
-> 2362                 result = fn(*args, **kwargs)
   2363             return result
   2364 

<ipython-input-27-156892c4cbc4> in check1(line, cell)
      6     globals = dict()
      7     locals = dict()
----> 8     exec(cell, globals, locals)

<string> in <module>

<string> in f(x)

NameError: name 'np' is not defined

Проблема, похоже, связана с пространством имен внутри функции, потому что она отлично работает:

%%check1

import numpy as np

print(np.sqrt(4))

и если я import numpy as np внутри функция f, тоже отлично работает.

Что мне здесь не хватает?

...