我认为你试图以错误的方式攻击问题。
首先是的,它可能会让相邻的减价单元变得非常黑客,在无头笔记本执行中不起作用。
你想要做的是使用IPython单元格魔术,只要单元格以2个百分号开头,后面跟一个标识符,它就允许任意语法。
通常你想要SQL单元格。
您可以参考相关文档有关cells magics 或者我可以告诉你如何建立一个:
from IPython.core.magic import (
Magics, magics_class, cell_magic, line_magic
)
@magics_class
class StoreSQL(Magics):
def __init__(self, shell=None, **kwargs):
super().__init__(shell=shell, **kwargs)
self._store = []
# inject our store in user availlable namespace under __mystore
# name
shell.user_ns['__mystore'] = self._store
@cell_magic
def sql(self, line, cell):
"""store the cell in the store"""
self._store.append(cell)
@line_magic
def showsql(self, line):
"""show all recorded statements"""
print(self._store)
## use ipython load_ext mechanisme here if distributed
get_ipython().register_magics(StoreSQL)
现在你可以在你的Python细胞利用SQL语法:
%%sql
select * from foo Where QUX Bar
第二cell:
%%sql
Insert Cheezburger into Can_I_HAZ
检查我们执行了什么(3 dashe S显示输入/输出划界,你不必键入它们):
%showsql
---
['select * from foo Where QUX Bar', 'Insert Cheezburger into Can_I_HAZ']
而你在你的问题问开头:
mysql.query(__mystore[-1])
当然,这要求你执行先前的单元格按正确的顺序排列,但没有什么能阻止您使用%%sql
语法命名您的单元格,例如,如果_store
是dict
或更好的类别,那么您将覆盖__getattr__
,以便像__getitem__
那样操作以使用点语法来访问字段。这是作为练习留给读者,或看看到底响应:
@cell_magic
def sql(self, line, cell):
"""store the cell in the store"""
self._store[line.strip()] = cell
然后你可以使用SQL细胞像
%%sql A1
set foo TO Bar where ID=9
然后在你的Python细胞
mysql.execute(__mystore.A1)
我也强烈建议在GitHub上看看Catherine Develin SqlMagic的IPython和这个Notebook gist,这些都显示了这一切。
在评论中,你似乎想说要添加pig
,没有什么能阻止你拥有魔法。也可以注入Javascript来启用SQL和PIG的正确语法高亮显示,但这超出了这个问题的范围。
我首先要问'可以这样做吗?'。我不认为这是显而易见的。 – cel
可以这样或那样的方式,我们总是可以自己尝试和解释'.ipynb'格式,并阅读单元格内容 –
我可以问一下,你想用这个来实现什么? –