Определите магию IPython, которая заменяет содержимое следующей ячейки

Команда %load line-magic загружает содержимое данного файла в текущую ячейку, например, выполняя:

[cell 1]    %load hello_world.py

... преобразовать ячейку в:

[cell 1]    # %load hello_world.py
            print("hello, world")

Я хотел бы создать команду %load_next line-magic, которая вместо этого загружала бы этот файл в следующую ячейку. Например, выполнение ячейки 1 в следующем блокноте:

[cell 1]    %load_next hello_world.py

[cell 2]    print("hello, cruel world")  # original content

... сохранит ячейку 1 без изменений и обновит ячейку 2 новым содержимым:

[cell 1]    %load_next hello_world.py

[cell 2]    print("hello, world")

Я пробовал это:

from IPython.core.magic import Magics, magics_class, line_magic
from pathlib import Path

@magics_class
class MyMagics(Magics):

    @line_magic
    def load_next(self, line):
        new_content = Path(line).read_text()
        self.shell.set_next_input(new_content, replace=False)

ip = get_ipython()
ip.register_magics(MyMagics)

Но он вставляет содержимое между текущей и следующей ячейкой:

[cell 1]    %load_next hello_world.py

[cell 2]    print("hello, world")

[cell 3]    print("hello, cruel world")  # original content

Можно ли заставить его либо заменить следующую ячейку, либо удалить следующую ячейку перед ее вставкой?

Self.shell.set_next_input(new_content, replace=False) вы пытались установить replace=True ?

sebrojas 06.01.2021 14:58

@sebrojas Заменяет текущую ячейку. Я хотел бы заменить следующую ячейку.

Aristide 06.01.2021 15:12

Помогает ли это stackoverflow.com/questions/27952428/…

Joe Ferndz 13.01.2021 08:44

@JoeFerndz Я так не думаю, насколько мне известно, эта нотация имеет дело со значением предыдущего выражения Python, меня интересует содержимое ячейки.

Aristide 13.01.2021 18:13
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python.
Некоторые методы, о которых вы не знали, что они существуют в Python.
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
5
4
577
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете запустить приведенный ниже скрипт. Невозможно получить все ячейки, поэтому я решил запустить код javascript, чтобы удалить следующую ячейку. Js часть находит все ячейки и удаляет следующую ячейку из текущей ячейки. Я тестировал на Jupyter Notebook и Jupyter Lab.

from IPython.display import display, HTML, Javascript
from IPython.core.magic import Magics, magics_class, line_magic
from pathlib import Path

@magics_class
class MyMagics(Magics):

    @line_magic
    def load_next(self, line):
        js_script = r"""<script>
            
            if (document.getElementById('notebook-container')) {
                //console.info('Jupyter Notebook');
                allCells = document.getElementById('notebook-container').children;
                selectionClass = /\bselected\b/;
                jupyter = 'notebook';
            }
            else if (document.getElementsByClassName('jp-Notebook-cell').length){
                //console.info('Jupyter Lab');
                allCells = document.getElementsByClassName('jp-Notebook-cell');
                selectionClass = /\bjp-mod-selected\b/;
                jupyter = 'lab';
            }
            else {
                console.info('Unknown Environment');
            }

            if (typeof allCells !== 'undefined') {
                for (i = 0; i < allCells.length - 1; i++) {
                    if (selectionClass.test(allCells[i].getAttribute('class'))){
                        allCells[i + 1].remove();
                        
                        // remove output indicators of current cell
                        window.setTimeout(function(){
                            if (jupyter === 'lab') {
                                allCells[i].setAttribute('class', allCells[i].getAttribute('class') + ' jp-mod-noOutputs');
                                allCells[i].getElementsByClassName('jp-OutputArea jp-Cell-outputArea')[0].innerHTML = '';
                            } else if (jupyter === 'notebook'){
                                allCells[i].getElementsByClassName('output')[0].innerHTML = '';
                            }
                        }, 20);
                        
                        break;
                    }
                }
            }
            </script>"""
        
        # remove next cell
        display(HTML(js_script))
        
        new_content = Path(line).read_text()
        self.shell.set_next_input(new_content, replace=False)

ip = get_ipython()
ip.register_magics(MyMagics)

Большое спасибо, это потрясающе! Я бы не смог использовать Javascript для этого. Он отлично работает, а с помощью NbExtension «Ячейки инициализации» я могу создавать блокноты Jupyter, которые автоматически обновляются при открытии. Одна придирка: после выполнения вертикальное пространство под магической ячейкой больше, чем обычно. У вас есть идеи, почему?

Aristide 13.01.2021 18:11

@Aristide Я удалил выходные индикаторы выбранной ячейки. Скрипт удаления выполняется через 20 миллисекунд после выполнения. Пожалуйста, используйте весь контент js_script js_script = r"""..... """. Добавлен идентификатор r для обратной косой черты.

Ismail Durmaz 13.01.2021 22:11

Другие вопросы по теме