我的问题是:如何编写可以访问IPython笔记本命名空间的IPython cell magic?
IPython允许编写用户定义的单元格魔法。我的计划是创建一个绘图函数,它可以绘制一个或多个任意Python表达式(基于Pandas Series对象的表达式),其中单元格字符串中的每一行都是图表中的单独图形。
这是细胞魔法的代码:
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()进行评估。结果将添加到Pandas DataFrame中。最后,使用matplotlib绘制DataFrame。
用法示例:首先在IPython笔记本中定义Pandas Series对象。
import pandas as pd
ts = pd.Series([1,2,3])
然后在IPython笔记本中调用魔法(下面的整个代码是一个单元格):
%%p
ts * 3
ts + 1
此代码失败,并显示以下错误:
NameError: name 'ts' is not defined
我怀疑问题是p
函数只接收ts * 3\n ts + 1
作为字符串,并且它无法访问IPython笔记本的命名空间中定义的ts
变量(因为p
函数在单独的.py文件中定义。)
我的代码如何更改,以便cell magic可以访问IPython笔记本中定义的ts
变量(因此不会因NameError而失败)?
答案 0 :(得分:5)
使用@needs_local_scope
decorator装饰器。文档有点缺失,但您可以看到how it is used,欢迎提供文档。
答案 1 :(得分:0)