Подтвердить что ты не робот

Чтение содержимого ячейки в записной книжке ipython

У меня есть ноутбук ipython со смешанными ячейками markdown и python.

И я хотел бы, чтобы некоторые из моих python ячеек читали соседние ячейки markdown и обрабатывали их как входные данные.

Пример желаемой ситуации:

CELL 1 (markdown): SQL-код для выполнения

CELL 2 (markdown): select * from tbl where x=1

CELL 3 (python): mysql.query(ipython.previous_cell.content)

(Синтаксис ipython.previous_cell.content составлен)

Выполнение "CELL 3" должно быть эквивалентно mysql.query("select * from tbl where x=1")

Как это можно сделать?

4b9b3361

Ответ 1

Я думаю, вы пытаетесь атаковать проблему неправильно.

Сначала да, можно получить смежную ячейку уценки по-настоящему хакерски, которая не будет работать в режиме безголового ноутбука.

То, что вы хотите сделать, это использовать магию ячеек IPython, которые допускают произвольный синтаксис, если ячейка начинается с 2-процентных знаков, за которыми следует идентификатор.

Обычно вам нужны ячейки SQL.

Вы можете сослаться на документацию о магиях ячеек или я могу показать вам, как это сделать:

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)

Теперь вы можете использовать синтаксис SQL в своих ячейках python:

%%sql 
select * from foo Where QUX Bar

вторая ячейка:

%%sql
Insert Cheezburger into Can_I_HAZ

проверьте, что мы выполнили (три штриха показывают разграничение ввода/вывода, вам не нужно вводить их):

%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)

Я также настоятельно рекомендую взглянуть на Кэтрин Девелин SqlMagic для IPython, и этот "Блокнот для ноутбуков" на GitHub, которые показывают все это в прямом эфире.

В комментарии вы, кажется, говорите, что хотите добавить pig, ничто не мешает вам иметь магию %%pig. Также можно добавить Javascript, чтобы включить корректное выделение синтаксиса SQL и PIG, но это выходит за рамки этого вопроса.