Python flake8 py неправильно сообщает W391 (без новой строки в конце файла)

W391 говорит, что в конце файла должна быть одна (и только одна) пустая строка. Однако flake8 сообщает об ошибке, когда в конце файла есть хотя бы одна новая строка:

$ cat /tmp/test.py
def hello():
    print('hello')


hello()


$ hexdump -C /tmp/test.py
00000000  64 65 66 20 68 65 6c 6c  6f 28 29 3a 0a 20 20 20  |def hello():.   |
00000010  20 70 72 69 6e 74 28 27  68 65 6c 6c 6f 27 29 0a  | print('hello').|
00000020  0a 0a 68 65 6c 6c 6f 28  29 0a 0a                 |..hello()..|
0000002b

Вы можете видеть выше, что на самом деле есть одна и только одна пустая строка в конце файла (0a равно \n). Однако, когда я запускаю flake8, я получаю ошибку W391:

$ flake8 /tmp/test.py
/tmp/test.py:6:1: W391 blank line at end of file

Почему это?


person Ben Davis    schedule 10.11.2019    source источник
comment
Есть два разрыва строки.   -  person Klaus D.    schedule 10.11.2019
comment
W391 подразумевает два символа разрыва строки, при условии, что есть по крайней мере еще одна строка. Последние два символа разрыва строки создают одну пустую строку в конце файла.   -  person Ben Davis    schedule 10.11.2019
comment
И это именно то, что говорится в сообщении.   -  person Klaus D.    schedule 10.11.2019
comment
Но он сообщает об этом как об ошибке. Прочтите спецификацию. В соответствии со спецификацией файл не содержит ошибок и не должен подвергаться линтингу.   -  person Ben Davis    schedule 10.11.2019
comment
Сообщение вводит в заблуждение. Это должны быть две пустые строки в конце файла или что-то подобное. Даже по спецификациям не подходит. У вас два, а должно быть одно.   -  person Klaus D.    schedule 10.11.2019
comment
Нет, в конце файла ОДНА пустая строка. В конце строки 4 есть один символ новой строки, а сразу за ним второй символ новой строки, что создает ОДНУ пустую строку в строке 5.   -  person Ben Davis    schedule 10.11.2019
comment
Два символа разрыва строки в конце создают две пустые строки. Один за обоими.   -  person Klaus D.    schedule 10.11.2019
comment
Я думаю, вы запутались. Два символа новой строки создают ОДНУ пустую строку.   -  person Ben Davis    schedule 10.11.2019
comment
Нет, вы не поняли, как работают разрывы строк. Возьмите новый редактор, введите несколько символов, дважды нажмите «Return» и посмотрите, сколько пустых строк осталось после того, что вы набрали.   -  person Klaus D.    schedule 10.11.2019
comment
Что ж, это смущает, но, похоже, я действительно ошибаюсь. Попробовав другой редактор, я обнаружил, что мое использование vim в течение более 10 лет промыло мне мозги, заставив думать, что две новые строки означают одну пустую строку. По-видимому, vim автоматически добавляет новую строку в каждый файл, что заставляет меня думать, что последней пустой строки там нет. Прошу прощения за мою путаницу и упрямую настойчивость!   -  person Ben Davis    schedule 10.11.2019


Ответы (1)


По-видимому, vim автоматически добавляет новую строку в каждый файл, что заставляет меня думать, что последней пустой строки там нет. Со временем эта неявная новая строка сбила меня с толку, и я подумал, что два символа новой строки в конце создают одну пустую строку.

Так что предупреждение правильное. В конце файла должен быть один и только один \n.

person Ben Davis    schedule 10.11.2019