IPython笔记本:如何编写可以访问笔记本变量的cell magic?

IPython笔记本:如何编写可以访问笔记本变量的cell magic?,python,ipython,ipython-notebook,Python,Ipython,Ipython Notebook,我的问题是:如何编写一个IPython cell magic,它可以访问IPython笔记本的名称空间 IPython允许编写用户定义的单元格魔法。我的计划是创建一个绘图函数,该函数可以绘制一个或多个任意Python表达式(基于Pandas系列对象的表达式),其中单元格字符串中的每一行都是图表中的一个单独图形 这是细胞魔法的密码: def p(line, cell): import pandas as pd import matplotlib.pyplot as plt

我的问题是:如何编写一个IPython cell magic,它可以访问IPython笔记本的名称空间

IPython允许编写用户定义的单元格魔法。我的计划是创建一个绘图函数,该函数可以绘制一个或多个任意Python表达式(基于Pandas系列对象的表达式),其中单元格字符串中的每一行都是图表中的一个单独图形

这是细胞魔法的密码:

def p(line, cell):
    import pandas as pd
    import matplotlib.pyplot as plt

    df = pd.DataFrame()
    line_list = cell.split('\n')

    counter = 0
    for line in line_list:
        df['series' + str(counter)] = eval(line)      
        counter += 1

    plt.figure(figsize = [20,6])
    ax = plt.subplot(111)
    df.plot(ax = ax)


def load_ipython_extension(ipython):
    ipython.register_magic_function(p, 'cell')
函数以字符串形式接收整个单元格内容。然后,此字符串按换行符拆分,并使用eval()进行计算。结果将添加到数据帧中。最后,使用matplotlib绘制数据帧

用法示例:首先在IPython笔记本中定义Pandas系列对象

import pandas as pd
ts = pd.Series([1,2,3])
然后调用IPython笔记本中的magic(下面的全部代码是一个单元格):

此代码失败,出现以下错误:

NameError: name 'ts' is not defined
我怀疑问题在于
p
函数只接收
ts*3\n ts+1
作为字符串,并且它无法访问在IPython notebook命名空间中定义的
ts
变量(因为
p
函数在单独的.py文件中定义)


如何更改我的代码,使cell magic能够访问IPython笔记本中定义的
ts
变量(因此不会因名称错误而失败)?

使用装饰程序。文档有点缺失,但您可以看到,对文档的贡献是受欢迎的

您也可以从中使用
shell.user\n
。例如:

from IPython.core.magic import Magics

class MyClass(Magics):
    def myfunc(self):
        print(self.shell.user_ns)

看看它在代码示例中是如何使用的:和。

谢谢Matt,非常有用!
from IPython.core.magic import Magics

class MyClass(Magics):
    def myfunc(self):
        print(self.shell.user_ns)