我認爲你試圖以錯誤的方式攻擊問題。
首先是的,它可能會讓相鄰的減價單元變得非常黑客,在無頭筆記本執行中不起作用。
你想要做的是使用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'格式,並閱讀單元格內容 –
我可以問一下,你想用這個來實現什麼? –