Правило пустых строк в интерактивном режиме - PullRequest
7 голосов
/ 06 декабря 2011

Мне было интересно, почему в Python существует другое правило для пустых строк между интерактивным приглашением и когда программа запускается из оболочки в качестве исполняемого файла.

Поскольку пустые строки игнорируются, мне нравится их обильное использование.Однако в интерактивной подсказке пустая строка используется для завершения цикла.Таким образом, я продолжаю сталкиваться с ошибками отступов, когда вставляю кусок кода в интерактивное приглашение, так как в моих циклах будут пустые строки.Следовательно, это делает процесс интерактивной отладки / разработки несколько утомительным.Помещение # вместо пустой строки помогает, но мне нравятся мои пустые строки.

Еще более раздражающим является различное поведение между приглашениями (например, python и ipython).Там, где интерактивная подсказка Python выдала бы мне ошибку там, где я ожидал, ipython продолжал бы выполнять код с отступом, как если бы он не был частью цикла без жалоб.

Я чувствую, что есть простое решение, но яЯ не знаю об этом.Я использую vi для редактирования и приглашения python / ipython.Спасибо.

Ответы [ 4 ]

3 голосов
/ 01 февраля 2017

... почему в Python существует другое правило для пустых строк между интерактивной подсказкой и когда программа запускается из оболочки

Поскольку интерпретатор пытается выполнить, как тольковы нажимаете return, но ей нужна пустая строка, чтобы узнать вашу функцию, цикл, если оператор или другой отступ блока завершен.Если вы пишете функцию, она не нужна (на самом деле не будет работать), если вы добавите пустые строки перед последней строкой функции.В этом случае пустая строка необходима для обозначения конца функции.

Вы можете выполнить сценарий без пустых строк из оболочки, например,

for i in range(3):
    print i
a = 1000
print a

Будет выдано

$ python test.py
0
1
2
1000

Но если вы вставите это в интерпретатор,вы получите

>>> for i in range(3):
...     print i
... a = 1000
  File "<stdin>", line 3
a = 1000
^
SyntaxError: invalid syntax
>>> print a
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined

Если добавить пустую строку для обозначения конца цикла

for i in range(3):
    print i

a = 1000
print a

и вставить ее в интерпретатор,

>>> for i in range(3):
...     print i
...
0
1
2
>>> a = 1000
>>> print a
1000

И эта пустая строка должна быть пустой, даже пробелы (возможно, автоматически добавленные вашим редактором) приведут к сбою интерпретатора.

Если вы хотите вставить класс в интерпретатор, то вам не нужны пробелы между строками, в том числе между методами.Это вызывает конфликт с PEP8, но это означает, что вы можете либо соблюдать PEP8, либо быть совместимым с переводчиком, но не оба.

Таким образом, если вы хотите иметь возможность копировать и вставлять свой код в стандартный интерпретатор Python, вам потребуется немного другой набор правил.

  • Окружающие определения функций и классов верхнего уровня с двумя пустыми строками.
  • Пустая строка необходима для кода модуля верхнего уровня (вне функции или класса) для завершения блока с отступом, такой как цикл for, try / исключением или оператор if.
  • Пустые строки нельзя использовать внутри функции, класса или метода (за исключением \ или #).

Придерживайтесь этих, и у вас сохранится возможность вставлять в переводчик.Однако для класса вы не будете строго PEP8, так как пустая строка обязательна до и после метода.

2 голосов
/ 06 декабря 2011

PEP8 определяет порядок использования пустых строк:

Пустые строки

Разделите определения функций и классов верхнего уровня двумя пустыми строками. Определения методов внутри класса разделены одной пустой строкой.

Дополнительные пустые строки могут использоваться (экономно) для разделения групп связанных функции. Пустые строки могут быть пропущены между связкой однострочники (например, набор фиктивных реализаций).

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

Python принимает символ перевода формы control-L (т.е. ^ L) в качестве пробела; Многие инструменты обрабатывают эти символы как разделители страниц, поэтому вы можете использовать их для разделения страниц связанных разделов вашего файла. Обратите внимание, некоторые редакторы и веб-средства просмотра кода могут не распознавать control-L как канал и покажет другой символ на его месте.

Если вы придерживаетесь PEP, единственным случаем, в котором пустые строки могут вызвать проблемы в интерактивной консоли, являются "пустые строки в функциях для обозначения логических разделов", я считаю.

Вы можете обойти проблему следующим образом:

>>> def a():
...     print 'foo'\
... 
...     print 'bar'
... 
>>> a()
foo
bar

Редактировать: Обратите внимание, что использование \ вместо #, как вы предлагаете в своем вопросе, оставляет пустую строку ... пустой (так как \ идет на предыдущий строка).

НТН!

1 голос
/ 20 сентября 2016

ipython v5 теперь отлично обрабатывает пустые мультилинии с отступами:

http://blog.jupyter.org/2016/07/08/ipython-5-0-released/

Из вышеприведенного сообщения в блоге:

Пакет prompt_toolkit - это замечательная библиотека от Джонатана Слендерс и недавно достигли версии 1.0. Выходя за пределы readline, prompt_toolkit предоставляет множество расширенных функций для редактирования текста в терминал, который значительно улучшит пользовательский опыт. Так как это кроссплатформенная библиотека, все наши пользователи на Linux / Unix, macOS и Windows извлечь выгоду из этих улучшений. Благодаря prompt_toolkit, IPython теперь поддерживает:

  • Подсветка синтаксиса при вводе
  • Реальное многострочное редактирование (клавиши со стрелками вверх и вниз перемещаются между строками)
  • Многострочная вставка без прерывания или немедленного выполнения кода
  • Лучший интерфейс для завершения кода (мы планируем улучшить его еще)
  • Дополнительная поддержка мыши
0 голосов
/ 06 декабря 2011

Если вы разрабатываете в системе Unix, используйте Sed!

Чтобы избавиться от всех пустых строк перед вставкой кода в интерактивное приглашение, используйте эту команду:

sed '/^$/d' mysourcefile

Sed - это потоковый редактор.Здесь он принимает mysourcefile в качестве входных данных, а затем отправляет отредактированный текст в stdout.Скопируйте и вставьте вывод в интерактивную оболочку Python, и все будет хорошо!

(Или используйте Screen, чтобы отправить отредактированный источник в другой сеанс экрана с открытой интерактивной оболочкой!)

...