Я пытаюсь создать ячейку 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, тоже отлично работает.
Что мне здесь не хватает?