In un taccuino Jupyter sono presenti alcuni effetti magici incorporati che modificano il contenuto di una cella del notebook. Ad esempio, la magia %load
sostituisce il contenuto della cella corrente con il contenuto di un file sul file system.Jupyter: Scrivi una magia personalizzata che modifica il contenuto della cella in cui si trova
Come posso scrivere un comando magico personalizzato che faccia qualcosa di simile?
Quello che ho stampe finora qualcosa da stdout
def tutorial_asset(line):
print('hello world')
def load_ipython_extension(ipython):
ipython.register_magic_function(tutorial_asset, 'line')
E posso caricarlo con %load_ext tutorial_asset
. Ma da li sono perso.
[Edit]:
ho trovato un modo per ottenere l'istanza shell interattiva:
@magics_class
class MyMagics(Magics):
@line_magic
def tutorial_asset(self, parameters):
self.shell
L'oggetto self.shell
sembra dare l'accesso completo al set di cellule nel notebook, ma l'unico modo che posso trovare per modificare le celle è fare self.shell.set_next_input('print("hello world")')
. Questo non è sufficiente perché, in un notebook Jupyter, quella cella di input viene saltata e non sovrascrive la cella di input, ma crea una nuova cella di input dopo di essa.
Questo andrebbe bene, ma se eseguo il notebook una seconda volta, crea un'altra cella di input con lo stesso file caricato, il che è fastidioso. Posso farlo caricare solo una volta, ad esempio, controllando se il contenuto è già nella cella successiva?