Как настроить IPython для выполнения блоков ячеек так же, как обычный Python REPL? - PullRequest
0 голосов
/ 10 января 2019

Ванильный питон REPL:

>>> 'na'
'na'
>>> for i in range(4):
...     f'{_+_}'
... else:
...     'batman'
... 
'nana'
'nananana'
'nananananananana'
'nananananananananananananananana'
'batman'
>>> 

IPython REPL с тем же интерпретатором:

>>> 'na'
'na'
>>> for i in range(4): 
...     f'{_+_}' 
... else: 
...     'batman' 
...
>>> _
'na'

Это различие очевидно связано с режимом, в котором IPython компилирует код , и не связано с обработчиком отображения . Можно ли настроить IPython для компиляции / исполнения блоков ячеек, как это делает обычный Python REPL? Я бы предпочел, чтобы IPython не вмешивался и не изменял такие базовые механизмы времени выполнения.

1 Ответ

0 голосов
/ 10 января 2019

Установите для параметра InteractiveShell.ast_node_interactivity значение 'all', либо с помощью магической команды %config:

%config InteractiveShell.ast_node_interactivity='all'

или в вашем ipython_config.py

c.InteractiveShell.ast_node_interactivity = 'all'

Это заставит IPython скомпилировать все в режиме 'single', режиме, который вызывает sys.displayhook, вместо режима 'exec', который не использует sys.displayhook.


Возможные настройки для InteractiveShell.ast_node_interactivity в настоящее время

  • 'all': скомпилировать все в режиме 'single'.
  • 'last': скомпилировать последний (простой или составной) оператор ячейки в режиме 'single'. Отличается от 'all' в случаях типа

    In [7]: for i in range(5):
       ...:     i
       ...: for i in range(3):
       ...:     i
       ...:     
    Out[7]: 0
    Out[7]: 1
    Out[7]: 2
    

    'all' напечатало бы значения i из обоих циклов.

  • 'last_expr': скомпилировать последний оператор ячейки в режиме 'single', если этот оператор является оператором выражения. Это IPython по умолчанию.

  • 'none': скомпилировать все в режиме 'exec'.

  • 'last_expr_or_assign': аналогично 'last_expr', но выполняется дополнительное преобразование AST для печати назначенного значения, если последний оператор является оператором присваивания:

    In [2]: xyz = "something else"
    Out[2]: "something else"
    
...