W391 blank line at end of file python что делать
Перейти к содержимому

W391 blank line at end of file python что делать

  • автор:

Python flake8 py reporting W391 (no newline at end of file) incorrectly

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:

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:

Super Kai - Kazuya Ito's user avatar

Ben Davis's user avatar

2 Answers 2

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.

PEP8: conflict between W292 and W391

W391 is a blank line, that is, two consecutive \n s. There is no conflict.

Solution 2

This is what W391 is talking about:

This is wrong according to W292:

What is correct is:

Solution 3

In Windows ‘\n’ is the separator between lines, but in Linux ‘\n’ is the ending sign on any line. Vim did nothing wrong to add ‘\n’ to the end of lines in Linux platform but following OS definition.

seler

Python Wizard Level 10

Updated on June 20, 2022

Comments

As far as I know in unix it’s a good practice to always have blank line at the end of file — or to put it in other words: every line should end with \n .

While checking my python code with PEP8 I noticed that it also states that there should be \n at end of file:

Saved searches

Use saved searches to filter your results more quickly

You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

W391 blank line at end of file introduces —> W292 no newline at end of file #365

W391 blank line at end of file introduces —> W292 no newline at end of file #365

Comments

Seems like a contradiction, fixing W391 introduces W292

Maybe there is an issue with the way I resolved W391

The text was updated successfully, but these errors were encountered:

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:

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:

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.

Вопрос №63599 от пользователя Дмитрий Андрусишин в уроке «Результат логических операций», курс «Основы Python»

Сначала проверяется оператор and. Булеан тип True и строка 'yes' не являются falsy значениями и их нельзя преобразовать в False. Оператор and выполняется слева направо, поэтому будет выбрано 'yes' .

Остается конструкция 'yes' or 'no' . Оператор or возвращает первое значение, которое можно преобразовать в True. yes можно преобразовать в True. В итоге на экран будет выведена строка yes .

После прочтения теории было непонятно, как решить задание. Решил через if и когда увидел решение учителя, пришло какое-то осознание.

И у вас линтер ругается на тесты, там строка лишняя пустая

/usr/src/app/tests/test_solution.py:10:1: W391 blank line at end of file

Согласен, решение не очевидно без комментариев. Если всё правильно понимаю, то буквально происходит следующее: 1) В случае (False and 'yes' or 'no') сначала сравниваем False and 'yes' из чего получаем False . Затем сравниваем уже False or 'no' и получаем 'no' 2) В случае (True and 'yes' or 'no') сначала сравниваем True and 'yes' из чего получаем 'yes' . Затем сравниваем уже 'yes' or 'no' и получаем 'yes'

Александр, всё верно!

Дмитрий, проверил код. Сейчас линтер ошибок не выдаёт. Спасибо!

Дмитрий Андрусишин, я тоже решил через if, посмотрел решение учителя, стал разбираться, прочёл ваш комментарий, ещё раз теорию и всё равно не понимаю((

Может быть, стоит несколько дополнить теорию? Иначе получается, что выполнить задание, опираясь на предоставленный материал, крайне трудно. Тоже решала через if. Даже после комментария совсем не очевидно, почему так: "Сначала проверяется оператор and. Булеан тип True и строка 'yes' не являются falsy значениями и их нельзя преобразовать в False. ### Оператор and выполняется слева направо, поэтому будет выбрано 'yes'." Получается, если and не найдет False или falsy значений, то выбирается последнее значение, которое можно преобразовать в true?

Я сейчас прохожу бесплатные вводные курсы на разных платформах по этой теме, сравниваю. Если бы Hexlet был первым, то я бы мало что понимала. На основном курсе теория подается так же "подробно"?

Juliette, полагаю для облегчения восприятия можно представить себе всё это дело выражениями булевой алгебры, где a ∨ 0 = a и a ∧ 0 = 0 .

∨ это у нас OR , а ∧ это AND и строки грубо говоря превращаются в:

0 ∧ a ∨ b -> return b # 0 ∧ a == 0 (Falsy ∧ Truthy, прервались и вернули первый False), полученный 0 ∨ b == b (Falsy ∨ Truthy, прервались и вернули первый True), `

1 ∧ a ∨ b -> return a # 1 ∧ a == a (Truthy ∧ Truthy, прервались и вернули второе значение. Логика такая, что в данном случае python вернёт второе значение, может и стоит это добавить в материал), полученный a ∨ b == a (Truthy ∨ Truthy, прервались и вернули первый True).

Прошу очередного комментария преподавателей.

Требует некоторого беэкграунда — авторы курса постоянно дают ссылки на материал, считаю это верным подходом. Я в итоге начал читать "Код. Тайный язык информатики" Чарльза Петцольда — рекомендую. Там как раз очень много про бинарную логику.

Булева алгебра на вики

Спасибо, книга очень интересная и доступно все изложено.

Решил, подсмотрев решение здесь. Попытался разобраться в готовом решении и понимания всё равно нет. Конечно, через if решается просто, но хотелось бы до конца понять, как работает код в этом случае. Не могу понять именно логику булевой алгебры, тоже запутался когда возвращается False/True, а когда значение.

Александр Байбеков, спасибо за комментарий! Очень помогло в понимании. Хотелось ещё раз уточнить: в случае сравнения True and 'yes' оператор and возвращает последнее значение (слева направо), если не находит аргумент, который можно преобразовать в False ? (True нельзя преобразовать в False и 'yes' нельзя, значит результат сравнения — последний аргумент)

Обновили теорию, рассказали поподробнее про составные выражения.

те же затруднения остались. Решил через if, сравнил с решением учителя, вернулся к теории, завис на Оператор И работает так, что его выполнение (слева направо) прерывается и возвращается результат первого аргумента, который можно преобразовать в False.

то есть True and 'yes' не находит аргумента falsy и не прерывается, аргумент не возвращается и выполнение переходит к or?

то есть выполнение всё-таки прерывается и аргумент возвращается?!

Виталий, обратите внимание на примеры, которые даются в теории.

Речь идет, когда первый аргумент ложный, т.е.

Как видите, возвращаются разные значения. Левое для OR, правое для AND

Александр Байбеков,

Это как раз то, чего не хватает в уроке. И второй момент — не хватает объяснения механизма работы формулы в разделе "Ошибка выбора"

Nikolai Gagarinov,

Судя по количеству вопросов, тема требует более полного раскрытия. Конкретно, вот эти моменты:

В разделе "Составные выражения"

В разделе "Ошибка выбора"

value == 'first' or value == 'second'

Даже после прочтения всех комментариев (особая благодарностьАлександру Байбекову за пример с булевой алгеброй) остается некоторое непонимание и неуверенность. Мне кажется, эти два момента заслуживают более подробного объяснения.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *