юрий пилипенко
Ученик
(151),
на голосовании
3 года назад
В Pycharm все нормально без ошибок, а при сдаче теста выдает такую ошибку .Пустую строку оставляю в конце Precompile check failed:
/solution//solution.py:26:1: W391 blank line at end of file
Голосование за лучший ответ
~Lunna~
Профи
(547)
3 года назад
У вас точно лишние строки. Слева у вас есть нумератор строчек, посмотрите, что у вас их больше. чем та строка, на которой у вас стоит курсор
ЕПрофи (515)
2 года назад
Вот спасибо! У меня оказался целый набор пустых строк)
W391 says that there should be one (and only one) blank line at the end of file. However, flake8 reports the error when there is at least one newline at the end of the file:
$ 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
You can see above there is in fact one and only one blank line at the end of the file (0a
is n
). However, when I run flake8, I get the W391 error:
$ flake8 /tmp/test.py
/tmp/test.py:6:1: W391 blank line at end of file
Why is that?
asked Nov 10, 2019 at 2:59
12
Apparently vim automatically adds a newline to every file, which fools me into thinking that last blank line isn’t there. Over time this implicit newline confused me into thinking two newline characters at the end created one blank line.
So, the warning is correct. There should be one and only one n
at the end of the file.
answered Nov 10, 2019 at 19:12
Ben DavisBen Davis
13k10 gold badges49 silver badges61 bronze badges
A newline at the end of a file does not mean that there needs to be an empty line. Your editor may not show this to you but the raw bytes would look like:
# your python code
def foo():n
return barn
If you don’t have the last n
there then you will see W391. You seem to be doing
Edited to fix the last example.
@davidaames —
Could you provide some sample code where this is an issue? Thanks.
Hey, I seem to be having this issue as well, with this sample code:
raise Exception('Error: Incorrect new dag flows on line '
+ str(i))
Since this error is highly whitespace-sensitive, I don’t think it can be reproduced with simple code blocks as those are stripped. Please upload files.
That said, I suspect that the initial problem was that the end of the file looked as follows:
# your python code
def foo():n
return barn
n
Note that the last line here is not empty but has 4 spaces. This should raise W391. It was then attempted to fix the error by removing the last newline, but that left the four spaces in the now last line, which caused W292 to be raised.
As a workaround in the meantime, I have a bit in my editor(vim) config(.vimrc) that strips trailing whitespace whenever a buffer is saved. That might help you (@justinkterry) in the short term, if you use vim and are ok with your editor cleaning whitespace up for you:
function! TrimTrailingWhitespace() :%s/s+$//e endfunction autocmd BufWritePre *.py :call TrimTrailingWhitespace()
or more concisely:
autocmd BufWritePre *.py :%s/s+$//e " Trim trailing whitespace
W391 appears to supercede W292.
$ echo -n "a = 1" > file.py | pycodestyle file.py
file.py:1:1: W391 blank line at end of file
Seems like W292 should be raised first.
Hmmm, for what it’s worth, it seems like Vim inserts the newline at the end of the file, but it doesn’t look like there is a newline. I wonder if this is what was happening with the OP?
It took me quite a while to believe that I actually deserved to get W391, but when I hexdump -C /the/file | tail
, it was true! The last two bytes were 0a 0a
.
This is the file I use:
# -*- coding: utf-8 -*-
"""Function to sanitise paths."""
from pathvalidate import sanitize_filename
import os
def sanitise(*paths):
return os.path.join(*[sanitize_filename(x) for x in paths])
The last line does have a [W292] warning on it. Flake8 passes fine.
Running hexdump, get:
hexdump -C sanitise.py | tail
00000040 70 61 74 68 76 61 6c 69 64 61 74 65 20 69 6d 70 |pathvalidate imp|
00000050 6f 72 74 20 73 61 6e 69 74 69 7a 65 5f 66 69 6c |ort sanitize_fil|
00000060 65 6e 61 6d 65 0a 69 6d 70 6f 72 74 20 6f 73 0a |ename.import os.|
00000070 0a 0a 64 65 66 20 73 61 6e 69 74 69 73 65 28 2a |..def sanitise(*|
00000080 70 61 74 68 73 29 3a 0a 20 20 20 20 72 65 74 75 |paths):. retu|
00000090 72 6e 20 6f 73 2e 70 61 74 68 2e 6a 6f 69 6e 28 |rn os.path.join(|
000000a0 2a 5b 73 61 6e 69 74 69 7a 65 5f 66 69 6c 65 6e |*[sanitize_filen|
000000b0 61 6d 65 28 78 29 20 66 6f 72 20 78 20 69 6e 20 |ame(x) for x in |
000000c0 70 61 74 68 73 5d 29 0a |paths]).|
000000c8
This is what I see on screen:
OS: Centos (7.6.1810), neovim (0.3.2), and neovim-qt (master)…
What happens when you run pycodestyle sanitise.py
from the command line? This could be a problem in the vim intergation.
What happens when you run pycodestyle sanitise.py from the command line? This could be a problem in the vim intergation.
HA! the one thing I did not try. It returns 0
, no output whatsoever.
I can’t reproduce this (nor @bsmoliak’s example) on the latest version:
$ pycodestyle --version 2.5.0 $ echo -n "a = 1" > file.py | pycodestyle file.py file.py:1:6: W292 no newline at end of file
Насколько я знаю в unix, хорошая практика всегда иметь пустую строку в конце файла – или, говоря словами: каждая строка должна заканчиваться на n
.
Проверяя код Python на PEP8, я заметил, что он также указывает, что в конце файла должно быть n
:
W292 no newline at end of file
JCR: The last line should have a newline.
Что странно, он конфликтует с W391:
W391 blank line at end of file
JCR: Trailing blank lines are superfluous.
Okay: spam(1)
W391: spam(1)n
Как это должно быть? Должен ли я иметь пустую строку в конце файла или нет?
Ответ 1
W391 – это строка blank, то есть два последовательных n
s. Не существует конфликта.
Ответ 2
Это то, о чем говорит W391:
print 'last line'
Это неверно в соответствии с W292:
print 'last line'
Что правильно:
print 'last line'
Ответ 3
В Windowsn – разделитель между строками, а в Linuxn – знак окончания на любой строке. Vim не сделал ничего плохого, чтобы добавить ‘n’ в конец строки на платформе Linux, но следуя определению ОС.
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
Почему это?
1 ответ
Лучший ответ
Очевидно, vim автоматически добавляет новую строку в каждый файл, что заставляет меня думать, что последней пустой строки не существует. Со временем этот скрытый символ новой строки запутал меня, заставив думать, что два символа новой строки в конце создали одну пустую строку.
Итак, предупреждение верно. В конце файла должен быть один и только один n
.
3
Ben Davis
10 Ноя 2019 в 19:12