2016-08-21 5 views
7

Я нашел этот вопрос о поведении итератора в Python:Почему QtConsole echo next()?

Python list iterator behavior and next(iterator)

Когда я напечатал в коде:

a = iter(list(range(10))) 
for i in a: 
    print a 
    next(a) 

в jupyter-qtconsole он вернулся:

0 
2 
4 
6 
8 

точно так, как Martijn Pieters сказал, что это должно произойти, когда интерпретатор не отвечает на звонок next(a).

Однако, когда я запусти тот же код в моем Bash интерпретатора и IDLE, код напечатал:

0 
1 
2 
3 
4 
5 
6 
7 
8 
9 

на консоль.

Я побежал код:

import platform 
platform.python_implementation() 

во всех трех средах, и все они сказали, что я побежал 'CPython'.

Так почему же QtConsole подавляет вызов next(a), когда IDLE и Bash нет?

Если это помогает, я запускаю Python 2.7.9 на Mac OSX и используя дистрибутив Anaconda.

ответ

3

Это всего лишь выбор разработчиков IPython (на которых основан QtConsole), сделанный в отношении того, что должно быть повторено пользователем.

В частности, в классе InteractiveShell, который используется, функция run_ast_nodes по умолчанию определена с помощью interactivity='last_expr'. Документация по этому атрибуту гласит:

interactivity : str 
    'all', 'last', 'last_expr' or 'none', specifying which nodes should be 
    run interactively (displaying output from expressions). 'last_expr' 
    will run the last node interactively only if it is an expression (i.e. 
    expressions in loops or other blocks are not displayed. Other values 
    for this parameter will raise a ValueError. 

Как вы можете видеть: выражения в петле или других блоках не отображается.

Вы можете изменить это в конфигурационных файлах для IPython и заставить его работать как ваш repl, если вам действительно нужно. Дело в том, что это было просто предпочтение дизайнеров.

Смежные вопросы