F541 f string is missing placeholders что значит
CI: Linting errors from flake >= 3.8.1 #34150
Comments
mgmarino commented May 13, 2020 •
The new version of flake bumps the version of pycodestyle, which results in several linting errors on CI. These include:
There is an additional issue with flake8-rst, e.g. here:
Happy to have a go, but would like suggestions about how to proceed? Suggestion:
The text was updated successfully, but these errors were encountered:
jreback commented May 13, 2020
for now i would simply fix the version of flake
aadithpm commented Jul 16, 2020 •
Is this still open and unassigned? Would like to take this if it is. Mostly wanna clarify how you’d want E741 addressed. As far as my limited knowledge goes, E741 is so we don’t get ‘1’ and ‘l’ or ‘O’ and ‘0’ confused and so on i.e similar looking characters that might be even more ambiguous with certain fonts.
mgmarino commented Jul 16, 2020
I think it’s still not possible to move past flake 3.8.1 if flake-rst is still being used, see e.g. kataev/flake8-rst#22
aadithpm commented Jul 16, 2020
mgmarino commented Jul 16, 2020
From my point of view, I think you could however definitely address E741 independent of the issues with flake-rst. Then maybe we could close this and open a separate issue for that one?
aadithpm commented Jul 16, 2020
Yep, did feel that addressing E741 was something that had to be done at some point if flake8 is going to be updated.
F-strings или как сделать код чуть более быстрым и читаемым
В Python есть 3 способа форматировать строки, и один из них лучше других. Но не будем забегать наперед — о каком именно форматировании вообще речь? Каждый раз когда мы хотим поприветствовать пользователя по имени нам нужно вставить строку с именем в строку-шаблон. Большинство полезных записей в логах так же содержат значения переменных. И вот пример:
Первый способ, форматирование оператором %, пришел в Python еще из С — он имитирует функцию printf. Этот способ был первым в питоне, и остается единственным (из обсуждаемых в статье) в Python версии 2.5 и ниже.
Второй способ — это метод str.format, принадлежащий встроенному классу строк. Он появился с Python 3.0, и был портирован в версию 2.6. Этот метод был рекомендован как обладающий более богатым синтаксисом.
Третий способ, f-string, появился в Python версии 3.6. Как объяснено в PEP-0498, создание нового способа форматирования строк было мотивировано недостатками существующих методов, которые авторы характеризуют как подверженные ошибкам, недостаточно гибкие и не элегантные:
This PEP is driven by the desire to have a simpler way to format strings in Python. The existing ways of formatting are either error prone, inflexible, or cumbersome.
Итак, у нас есть три способа решить одну задачу. Но может это дело личного вкуса и предпочтений? Возможно, но стиль вашего кода (особенно кода в проекте с большим количеством участников) точно выиграет от единообразия. В лучшем случае стоит использовать один метод форматирования строк, тогда читать код станет проще. Но какой же метод выбрать? И есть ли разница в производительности кода?
Попробуем ответить на вопрос о производительности экспериментально:
Разница значительная. И что же теперь, запускать поиск regex на «.format» и переписывать сотни выражений? В принципе задача простая, но трудоемкая. Плюс вероятность допустить ошибку и посадить баг в до этого работающий код! Кажется, есть место для автоматизации. И действительно, существуют библиотеки способные конвертировать большинство выражений в f-strings: flynt, pyupgrade.
Flynt прост в использовании. К примеру, запустим конвертацию на исходном коде flask:
Pyupgrade включает в себя больше функционала, и может почистить ваш код от многих артефактов Python 2 — таких как наследование от object, указание имен классов в super и многое другое. Pyupgrade задуман для использования с pre-commit, утилитой для автоматической модификации кода перед коммитами.
Конвертировать лучше исходники в гите или другом контроле версий. Стоит прогнать тесты и посмотреть на изменения самому (используя git diff или среды типа PyCharm). Покуда среди нас живы те, кому не все равно, что код стал на пару символов короче, проактивная конвертация также сэкономит их время. Ведь рано или поздно кто-то начнет делать руками то, что можно сделать утилитой. F-strings работают только на Python 3.6+, но скоро это не будет проблемой так как другие версии устареют.
Мы рассмотрели три способа форматирования строк, доступные в версиях Python 3.6+, их краткую историю и сравнили их производительность. Мы также рассмотрели существующие в открытом доступе утилиты для автоматической конвертации кода к новому методу форматирования строк, и их дополнительные функции. Не забывайте о простых вещах в вашем коде, и удачи!
CI: Linting errors from flake >= 3.8.1 #34150
Comments
mgmarino commented May 13, 2020 •
The new version of flake bumps the version of pycodestyle, which results in several linting errors on CI. These include:
There is an additional issue with flake8-rst, e.g. here:
Happy to have a go, but would like suggestions about how to proceed? Suggestion:
The text was updated successfully, but these errors were encountered:
jreback commented May 13, 2020
for now i would simply fix the version of flake
aadithpm commented Jul 16, 2020 •
Is this still open and unassigned? Would like to take this if it is. Mostly wanna clarify how you’d want E741 addressed. As far as my limited knowledge goes, E741 is so we don’t get ‘1’ and ‘l’ or ‘O’ and ‘0’ confused and so on i.e similar looking characters that might be even more ambiguous with certain fonts.
mgmarino commented Jul 16, 2020
I think it’s still not possible to move past flake 3.8.1 if flake-rst is still being used, see e.g. kataev/flake8-rst#22
aadithpm commented Jul 16, 2020
mgmarino commented Jul 16, 2020
From my point of view, I think you could however definitely address E741 independent of the issues with flake-rst. Then maybe we could close this and open a separate issue for that one?
aadithpm commented Jul 16, 2020
Yep, did feel that addressing E741 was something that had to be done at some point if flake8 is going to be updated.
Python Fundamentals (5) — Placeholders in Python strings
Let’s dive right in with some Python strings here:
We can see that, as previously, we are printing (“Hello world”) in the first line. We are also assigning a value to the name variable, but this time we are doing this via an input function.
The input function displays a string of text, and it awaits an input from the user. In this case, the text is “What is your name?” and it clearly expects the user to type a response here. Once the user has entered a response, this data is immediately assigned (put into) to the variable called name.
However, note that we have four ways in which was can display (print) this data. The first wayon line 4 is a simple print (name) command — nothing crazy there.
Line 5 features the + operator we saw previously. This creates string concatenation — it joins strings together, and it requires you to judiciously insert a space into your string in order to display properly. This is why my executed code displays as ‘HelloSteve’ with no space.
Line 6 use a comma rather than a +. The comma is essentially a way of separating items in a string, and was used extensively in Python 2. It is perfectly respectable, and it handily inserts a space automatically when separating items, as you can see above.
Is this using a sledgehammer to crack a nut? Well in this case, yes, but that is only because this is a very simple case. Take this one with three variables. See how much easier, more elegant and more, well, Pythonic, it is to create three variables, assign them with values from input statements, and then display them using the <0> <1>and <2>placeholders?
Стильный код на Python, или учимся использовать Flake8
Автор: Анатолий Соловей, developer
Язык программирования Python очень востребован на современном рынке, он развивается изо дня в день, и вокруг него сложилось активное сообщество. Во избежание конфликтов между разработчиками-питонистами, создатели языка написали соглашение PEP 8, описывающее правила оформления кода, однако даже там отмечено, что:
Many projects have their own coding style guidelines. In the event of any conflicts, such project-specific guides take precedence for that project.
В результате добавления новых правил количество требований к оформлению кода увеличилось настолько, что удержать их в голове стало очень трудно. При этом обращение к гайдам может занимать много времени и отвлекать от процесса разработки.
За долгое время работы у программистов вырабатывается собственный стиль написания кода, предпочтения в стайлгайдах и прочие мелочи, которые оставляют авторскую печать на программах девелопера. Убедить разработчиков отказаться от привычных им кодстайлов очень сложно, но, даже если это удастся, велик шанс, что в их коде будут проскакивать старые фишки, добавленные в силу привычки.
Когда каждый апдейт проходит строгий код ревью, включающий в себя проверку стилей, подобные ошибки могут очень сильно замедлять процесс разработки. А если ошибки в итоге не заметят даже в процессе ревью, в системе контроля версий проекта очень скоро появится куча нечитаемого и непонятного кода.
На помощь в этом случае приходят линтеры — инструменты, контролирующие оформление кода в проекте. Именно они помогают поддерживать его чистоту и, в нашем случае, предотвращать создание коммитов, которые могут содержать ошибки. Я для контроля качества использую Flake8 и сейчас постараюсь объяснить, почему выбрал именно его, и расскажу, как его настроить, чтобы получить максимальный результат. Заинтересовались? Добро пожаловать под кат.
Flake8: Your Tool For Style Guide Enforcement
Сам Flake8 — инструмент, позволяющий просканировать код проекта и обнаружить в нем стилистические ошибки и нарушения различных конвенций кода на Python.
Flake8 умеет работать не только с PEP 8, но и с другими правилами, к тому же поддерживает кастомные плагины, поэтому в дальнейшем в этой статье я буду отталкиваться от правил из Google Python Style Guide.
Почему Flake8?
Flake8: pep8 + pyflakes + more
Создатель Flake8 Тарек Зиаде ставил перед собой цель объединить главные популярные инструменты контроля кодстайла в одной библиотеке, с чем в итоге успешно справился — Flake8 получился действительно универсальным.
Легкость установки и конфигурации
Чтобы проверить, отвечает ли код в вашем проекте основным требованиям PEP 8, достаточно установить Flake:
и запустить его — просто ввести в командной строке:
после чего вы получите список с именами файлов и номерами строк, где были допущены ошибки, и подробное описание самих ошибок:
Великолепно, не правда ли? Но и это не всё. Если вы не любитель работать с консолью, то вы можете настроить интеграцию Flake8 с IDE или редактором, который вы предпочитаете использовать.
Интеграция Flake8 с редакторами и IDE
Интеграция с PyCharm
Так же актуально и для любой другой IDE от JetBrains.
Интеграция проводится всего за пару несложных шагов.
Откройте настройки External Tools в File → Settings → Tools и нажмите на “+”, затем заполните поля по этому шаблону:
После этого нажмите на Output Filters, а затем на “+”, чтобы добавить новое правило для вывода сообщений от флейка:
Здесь мы говорим PyCharm, что хотим, чтобы в выводе строки с ошибками были кликабельными и открывали в редакторе файл и место с ошибкой
Все. Интеграция Flake8 с PyCharm закончена. Чтобы вызвать флейк и проверить свой код, кликаем правой кнопкой мыши на файл/директорию, которую мы хотим проверить, и в контекстном меню выбираем External Tools → Flake8.
В выводе PyCharm появится кликабельный список нарушений в выбранном файле/директории:
Интеграция с Atom
Чтобы установить инструмент Flake8 для Atom, используйте Atom package manager в Settings и найдите там linter-flake8:
из командной строки.
Затем перейдите в linter-flake8 settings и укажите путь к директории, где установлен flake8:
У linter-flake8 есть собственный ReadMe по настройке, с которым при желании вы можете ознакомиться на странице самого linter-flake8 в Atom.
Наличие Version Control Hooks
Именно это я считаю главным достоинством Flake8, которое выделяет его среди других линтеров. В отличии от большинства подобных инструментов, где для настройки VCS-хуков используются целые отдельные библиотеки и модули (как, например, в Pylint), настройка хуков в флейке проводится буквально в две строчки.
На момент написания этой статьи, Flake8 умеет использовать pre-commit-хуки для Git и Mercurial. Эти хуки позволяют, например, не допускать создания коммита при нарушении каких-либо правил оформления.
Установить хук для Git:
И настроить сам гит, чтобы учитывать правила Flake8:
Я продемонстрирую, как Git hook работает на проекте, который я использовал для примера интеграции Flake8 с PyCharm. В модуле flake8tutorial.py мы видим очевидные ошибки: импортированные и неиспользованные модули, остсутствие докстринга и пустой строки в конце файла.
Первым делом проинициализируем в этом проекте git-0репозиторий, установим flake8 хук и скажем нашему git, что он должен прогонять флейк перед коммитами:
Затем попробуем провести первый коммит:
Как видите, flake8 был вызван перед коммитом и не позволил нам закоммитить невалидные изменения.
Теперь фиксим ошибки, отмеченные флейком, и пытаемся закоммитить валидный код:
Коммит успешно создан. Отлично!
Настройка Flake8 для Mercurial практически идентична. Для начала нужно установить Flake8 Mercurial Hook:
И настроить сам Mercurial:
Вот и все, хук для Меrcurial установлен, настроен и готов к использованию!
Подробнее о конфигурации Flake8
Базовая конфигурация
Список дополнительных опций и правил можно передать прямо при вызове из командной строки таким образом:
(в этом примере опцией select мы говорим, чтобы Flake сообщал о нарушениях только правила E123 (это код правила “closing bracket does not match indentation of opening bracket’s line”)).
Кстати, полный список опций с описанием вы можете найти в документации к самой библиотеке.
На мой взгляд, куда предпочтительнее настраивать Flake с помощью конфигурационных файлов, вы можете хранить настройки в одном из файлов setup.cfg, tox.ini или.flake8. Для ясности я предпочитаю использовать последний вариант.
Файл с настройками позволяет контролировать использование библиотекой тех же опций, что настраиваются для командной строки, базовый конфигурационный файл выглядит так:
В конфигурационных файлах можно оставлять комментарии, это полезно делать, если вы предоставляете большой список правил, которые Flake должен игнорировать:
Также можно добавить в исключения отдельную строку в вашем модуле, просто оставив на этой строке комментарий noqa. Тогда при проверке модуля Flake8 будет игнорировать ошибки, найденные в строках, помеченных этим комментарием:
Модули, расширяющие функциональность
Так как Flake позволяет создавать и использовать кастомные плагины, для него можно найти большое количество open-source плагинов. Я опишу только те, которые использую сам и считаю особенно полезными:
Плагин, проверяющий порядок импортов в проекте: в стандартной конфигурации первыми должны идти импорты стандартных библиотек (stdlib), затем импорты сторонних библиотек, а потом локальные пакеты, причем каждая группа отделена пустой строкой и отсортирована в алфавитном порядке.
Этот плагин расширяет список предупреждений Flake, добавляя туда три новых:
Более подробно о настройке flake8-import-order можно прочитать на странице библиотеки на Github.
Плагин, добавляющий поддержку функционала из pydocstyle — проверку докстрингов на соответствие конвенциям Питона.
Список добавляемых этой библиотекой правил можно найти в документации pydocstyle.
Сама по себе эта библиотека никак не настраивается, однако добавленные правила можно внести в исключения, если какое-то из них неактуально для вашего проекта:
Страница библиотеки на Github тут.
Плагин, проверяющий код на использование встроенных имен в качестве переменных или параметров.
Как и в случае с flake8-docstrings, у плагина нет дополнительных настроек, но добавленные им правила можно, например, внести в исключения флейка:
Более подробную информацию об этом плагине можно найти на странице этого плагина на Github.
Плагин, позволяющий контролировать тип кавычек, которые будут использоваться в проекте.
Более подробную информацию об этом плагине можно найти на странице этого плагина на Github.
Послесловие
Хотя настройки, описанные выше, в 97,5 % случаев смогут предотвратить появление некачественного кода в репозитории, он так или иначе может оказаться запушенным (например, если деву было лень вводить две строчки для настройки pre-commit hook). Поэтому я настоятельно рекомендую добавить вызов Flake8 на этапе билда пул-реквестов в используемой вами системе continuous integration, чтобы предотвратить мердж невалидных пул-реквестов и попадание ошибок в мастер.
Надеюсь, эта статья была вам полезна и позволит в дальнейшем максимально гибко и качественно настраивать рабочий процесс и стайлгайды в ваших Python-проектах. Всех благ.