I ran into a similar issue following the course Test-Driven Development with Django, Django REST Framework, and Docker
.
I determined that a different version of flake8
was running locally vs during my GitHub Action.
I checked locally by running (within the docker container)…
flake8 --version
…and compared that output to the logs for my GitHub Action.
In my case, flake8 3.7.9
was running in the local container, but the GitHub Action was using flake8 3.8.4
.
Looks like a new pyflakes
check for F541
made it into flake8 3.8.0
(see https://gitlab.com/pycqa/flake8/-/issues/648)
As for a fix, I see two options:
- convert f-strings without placeholders in the source to string literals
- force
flake8 3.7.9
during the GitHub Action
for example, in Dockerfile.prod
…
RUN pip install black flake8==3.7.9 isort
…allowed my build to finish successfully. It seems better to upgrade flake8
though and make the source comply with F541
.
I tried for awhile to understand why…
RUN pip install black flake8 isort
…wouldn’t use the previously-created wheels for those packages (see Dockerfile.prod
below).
My guess is that the instruction to install and run linters during the builder
stage can’t use the previously-created wheels for those linters because said wheels were built with --no-deps
. I presume that pip
falls back to searching the online index in that case and lacking other instructions installs the latest available version. Since my Dockerfile
differs materially from my Dockerfile.prod
in this area, I conclude that this gives rise to a different version of flake8
running locally vs during my GitHub Action.
Dockerfile.prod
:
#Builder
FROM python:3.8.2-alpine as builder
WORKDIR /usr/src/app
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONBUFFERED 1
RUN apk update
&& apk add postgresql-dev gcc python3-dev musl-dev
RUN pip install --upgrade pip
COPY ./requirements.txt /usr/src/app/requirements.txt
RUN pip wheel --no-cache-dir --no-deps --wheel-dir /usr/src/app/wheels -r requirements.txt
COPY . /usr/src/app/
RUN pip install black flake8 isort
RUN flake8 .
RUN black --exclude=migrations .
RUN isort ./*/*.py
#Final
FROM python:3.8.2-alpine
WORKDIR /usr/src/app
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONBUFFERED 1
ENV DEBUG 0
ENV SECRET_KEY foo
ENV DJANGO_ALLOWED_HOSTS localhost 127.0.0.1 [::1] .herokuapp.com
RUN apk update
&& apk add postgresql-dev gcc python3-dev musl-dev
COPY --from=builder /usr/src/app/wheels /wheels
COPY --from=builder /usr/src/app/requirements.txt .
RUN pip install --upgrade pip
RUN pip install --no-cache /wheels/*
COPY . /usr/src/app/
RUN python manage.py collectstatic --noinput
RUN adduser -D myuser
RUN chown myuser /usr/src/app
USER myuser
CMD gunicorn drf_project.wsgi:application --bind 0.0.0.0:$PORT
Я столкнулся с аналогичной проблемой после прохождения курса
Test-Driven Development with Django, Django REST Framework, and Docker
.
Я определил, что другая версия
flake8
работал локально, а не во время моего действия GitHub.
Я проверил локально, запустив (в контейнере докера)…
flake8 --version
… и сравнил этот вывод с журналами моего действия GitHub.
В моем случае,
flake8 3.7.9
работал в локальном контейнере, но действие GitHub использовало
flake8 3.8.4
.
Похоже на новый
pyflakes
проверить
F541
превратился в
flake8 3.8.0
(см. https://gitlab.com/pycqa/flake8/-/issues/648)
Что касается исправления, я вижу два варианта:
- преобразовать f-строки без заполнителей в исходном тексте в строковые литералы
- сила
flake8 3.7.9
во время действия GitHub
например, в
Dockerfile.prod
…
RUN pip install black flake8==3.7.9 isort
… позволил моей сборке успешно завершиться. Вроде лучше обновить
flake8
хотя и сделать так, чтобы источник соответствовал
F541
.
Некоторое время я пытался понять, почему…
RUN pip install black flake8 isort
… не будет использовать ранее созданные колеса для этих пакетов (см.
Dockerfile.prod
ниже).
Я предполагаю, что инструкция по установке и запуску линтеров во время
builder
stage не может использовать ранее созданные колеса для этих линтеров, потому что указанные колеса были построены с
--no-deps
. Я предполагаю, что
pip
в этом случае возвращается к поиску в онлайн-индексе и при отсутствии других инструкций устанавливает последнюю доступную версию. Поскольку мой
Dockerfile
существенно отличается от моего
Dockerfile.prod
в этой области я прихожу к выводу, что это дает начало другой версии
flake8
работает локально, а не во время действия GitHub.
Dockerfile.prod
:
#Builder
FROM python:3.8.2-alpine as builder
WORKDIR /usr/src/app
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONBUFFERED 1
RUN apk update
&& apk add postgresql-dev gcc python3-dev musl-dev
RUN pip install --upgrade pip
COPY ./requirements.txt /usr/src/app/requirements.txt
RUN pip wheel --no-cache-dir --no-deps --wheel-dir /usr/src/app/wheels -r requirements.txt
COPY . /usr/src/app/
RUN pip install black flake8 isort
RUN flake8 .
RUN black --exclude=migrations .
RUN isort ./*/*.py
#Final
FROM python:3.8.2-alpine
WORKDIR /usr/src/app
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONBUFFERED 1
ENV DEBUG 0
ENV SECRET_KEY foo
ENV DJANGO_ALLOWED_HOSTS localhost 127.0.0.1 [::1] .herokuapp.com
RUN apk update
&& apk add postgresql-dev gcc python3-dev musl-dev
COPY --from=builder /usr/src/app/wheels /wheels
COPY --from=builder /usr/src/app/requirements.txt .
RUN pip install --upgrade pip
RUN pip install --no-cache /wheels/*
COPY . /usr/src/app/
RUN python manage.py collectstatic --noinput
RUN adduser -D myuser
RUN chown myuser /usr/src/app
USER myuser
CMD gunicorn drf_project.wsgi:application --bind 0.0.0.0:$PORT
how did you install flake8?
unmodified output of flake8 --bug-report
{ "platform": { "python_implementation": "CPython", "python_version": "3.9.2", "system": "Linux" }, "plugins": [ { "plugin": "flake8-bugbear", "version": "23.2.13" }, { "plugin": "flake8-builtins", "version": "2.1.0" }, { "plugin": "flake8-docstrings", "version": "1.7.0" }, { "plugin": "flake8-eradicate", "version": "1.4.0" }, { "plugin": "flake8-tidy-imports", "version": "4.8.0" }, { "plugin": "mccabe", "version": "0.7.0" }, { "plugin": "pycodestyle", "version": "2.9.1" }, { "plugin": "pyflakes", "version": "2.5.0" } ], "version": "5.0.4" }
describe the problem
what I expected to happen
A F541 (f-string is missing placeholders) warning, even for f-string missing placeholders that are concatenated with others f-strings that have them.
sample code
foo = 'bar' print(f'{foo}' f'foo')
commands ran
Note: command gives no output.
Notes
If the first string is not a f-string, then the warning is correctly issued:
foo = 'bar' print('foo' f'foo')
$ flake8 ./t.py:3:7: F541 f-string is missing placeholders
Solution 1
f string work with place holder
Example :
If you want to put ‘/summary/’ in f string assign it to some variable then put that variable in place holder
Syntax is
f'{variable}'
Example :
f'{"quoted string"}'
Solution 2
I ran into a similar issue following the course Test-Driven Development with Django, Django REST Framework, and Docker
.
I determined that a different version of flake8
was running locally vs during my GitHub Action.
I checked locally by running (within the docker container)…
flake8 --version
…and compared that output to the logs for my GitHub Action.
In my case, flake8 3.7.9
was running in the local container, but the GitHub Action was using flake8 3.8.4
.
Looks like a new pyflakes
check for F541
made it into flake8 3.8.0
(see https://gitlab.com/pycqa/flake8/-/issues/648)
As for a fix, I see two options:
- convert f-strings without placeholders in the source to string literals
- force
flake8 3.7.9
during the GitHub Action
for example, in Dockerfile.prod
…
RUN pip install black flake8==3.7.9 isort
…allowed my build to finish successfully. It seems better to upgrade flake8
though and make the source comply with F541
.
I tried for awhile to understand why…
RUN pip install black flake8 isort
…wouldn’t use the previously-created wheels for those packages (see Dockerfile.prod
below).
My guess is that the instruction to install and run linters during the builder
stage can’t use the previously-created wheels for those linters because said wheels were built with --no-deps
. I presume that pip
falls back to searching the online index in that case and lacking other instructions installs the latest available version. Since my Dockerfile
differs materially from my Dockerfile.prod
in this area, I conclude that this gives rise to a different version of flake8
running locally vs during my GitHub Action.
Dockerfile.prod
:
#Builder
FROM python:3.8.2-alpine as builder
WORKDIR /usr/src/app
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONBUFFERED 1
RUN apk update
&& apk add postgresql-dev gcc python3-dev musl-dev
RUN pip install --upgrade pip
COPY ./requirements.txt /usr/src/app/requirements.txt
RUN pip wheel --no-cache-dir --no-deps --wheel-dir /usr/src/app/wheels -r requirements.txt
COPY . /usr/src/app/
RUN pip install black flake8 isort
RUN flake8 .
RUN black --exclude=migrations .
RUN isort ./*/*.py
#Final
FROM python:3.8.2-alpine
WORKDIR /usr/src/app
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONBUFFERED 1
ENV DEBUG 0
ENV SECRET_KEY foo
ENV DJANGO_ALLOWED_HOSTS localhost 127.0.0.1 [::1] .herokuapp.com
RUN apk update
&& apk add postgresql-dev gcc python3-dev musl-dev
COPY --from=builder /usr/src/app/wheels /wheels
COPY --from=builder /usr/src/app/requirements.txt .
RUN pip install --upgrade pip
RUN pip install --no-cache /wheels/*
COPY . /usr/src/app/
RUN python manage.py collectstatic --noinput
RUN adduser -D myuser
RUN chown myuser /usr/src/app
USER myuser
CMD gunicorn drf_project.wsgi:application --bind 0.0.0.0:$PORT
Solution 3
./app/db.py:14:1: E303 too many blank lines (3) ./tests/test_ping.py:4:1: F401 ‘app.main’ imported but unused ./tests/test_summaries.py:6:1: F401 ‘pytest’ imported but unused
I can see some extra error too which will again make your build fail in ci test run
From line 14 you need to remove extra line
From line 4 and 6 you imported app.main and pytest which is unused in your code so need to remove that too
Comments
-
Following the course “FastAPI-TDD with Docker” I got the project to build and pass locally, then in the github action it fails:
It seems the offensive line in the source is:
response = test_app_with_db.get(f"/summaries/")
and the Github Action result is:
Run docker exec fastapi-tdd python -m flake8 . docker exec fastapi-tdd python -m flake8 . shell: /bin/bash -e {0} env: IMAGE: docker.pkg.github.com/$GITHUB_REPOSITORY/web ./app/db.py:14:1: E303 too many blank lines (3) ./tests/test_ping.py:4:1: F401 'app.main' imported but unused ./tests/test_summaries.py:6:1: F401 'pytest' imported but unused ./tests/test_summaries.py:60:37: F541 f-string is missing placeholders ##[error]Process completed with exit code 1.
Recents
Содержание
- Github Action flake8 fails: f-string is missing placeholders
- 3 Answers 3
- Ошибка Github Action flake8: в f-строке отсутствуют заполнители
- 2 ответа
- CI: Linting errors from flake >= 3.8.1 #34150
- Comments
- mgmarino commented May 13, 2020 •
- jreback commented May 13, 2020
- aadithpm commented Jul 16, 2020 •
- mgmarino commented Jul 16, 2020
- aadithpm commented Jul 16, 2020
- mgmarino commented Jul 16, 2020
- aadithpm commented Jul 16, 2020
- F-Строки: Новый улучшенный способ форматирования строк в Python
- Простой синтаксис
- Произвольные выражения
- Многострочные F-Strings
- Скорость
Github Action flake8 fails: f-string is missing placeholders
Following the course «FastAPI-TDD with Docker» I got the project to build and pass locally, then in the github action it fails:
It seems the offensive line in the source is:
and the Github Action result is:
3 Answers 3
f string work with place holder Example : If you want to put ‘/summary/’ in f string assign it to some variable then put that variable in place holder
./app/db.py:14:1: E303 too many blank lines (3) ./tests/test_ping.py:4:1: F401 ‘app.main’ imported but unused ./tests/test_summaries.py:6:1: F401 ‘pytest’ imported but unused
I can see some extra error too which will again make your build fail in ci test run
From line 14 you need to remove extra line From line 4 and 6 you imported app.main and pytest which is unused in your code so need to remove that too
I ran into a similar issue following the course Test-Driven Development with Django, Django REST Framework, and Docker .
I determined that a different version of flake8 was running locally vs during my GitHub Action.
I checked locally by running (within the docker container).
. and compared that output to the logs for my GitHub Action.
In my case, flake8 3.7.9 was running in the local container, but the GitHub Action was using flake8 3.8.4 .
Looks like a new pyflakes check for F541 made it into flake8 3.8.0 (see https://gitlab.com/pycqa/flake8/-/issues/648)
As for a fix, I see two options:
- convert f-strings without placeholders in the source to string literals
- force flake8 3.7.9 during the GitHub Action
for example, in Dockerfile.prod .
RUN pip install black flake8==3.7.9 isort
. allowed my build to finish successfully. It seems better to upgrade flake8 though and make the source comply with F541 .
Источник
Ошибка Github Action flake8: в f-строке отсутствуют заполнители
После курса «FastAPI-TDD с Docker» я получил проект для сборки и передачи локально, затем в действии github он терпит неудачу:
Похоже, что оскорбительная фраза в источнике:
и результат действия Github:
2 ответа
F строка работает с заполнителем Пример: если вы хотите поместить ‘/summary/’ в строку f, назначьте ее какой-либо переменной, затем поместите эту переменную в заполнитель
./app/db.py:14:1: E303 слишком много пустых строк (3) ./tests/test_ping.py:4:1: F401 ‘app.main’ импортировано, но не используется./tests/test_summaries.py:6:1: F401 ‘pytest’ импортирован, но не используется
Я также вижу дополнительную ошибку, которая снова приведет к сбою вашей сборки при запуске теста ci
Из строки 14 вам нужно удалить лишнюю строку. Из строк 4 и 6 вы импортировали app.main и pytest, которые не используются в вашем коде, поэтому их тоже нужно удалить.
Я столкнулся с аналогичной проблемой после прохождения курса Test-Driven Development with Django, Django REST Framework, and Docker .
Я определил, что другая версия flake8 работал локально, а не во время моего действия GitHub.
Я проверил локально, запустив (в контейнере докера).
. и сравнил этот вывод с журналами моего действия GitHub.
В моем случае, flake8 3.7.9 работал в локальном контейнере, но действие GitHub использовало flake8 3.8.4 .
Похоже на новый pyflakes проверить F541 превратился в flake8 3.8.0 (см. https://gitlab.com/pycqa/flake8/-/issues/648)
Что касается исправления, я вижу два варианта:
- преобразовать f-строки без заполнителей в исходном тексте в строковые литералы
- сила flake8 3.7.9 во время действия GitHub
например, в Dockerfile.prod .
RUN pip install black flake8==3.7.9 isort
. позволил моей сборке успешно завершиться. Вроде лучше обновить flake8 хотя и сделать так, чтобы источник соответствовал F541 .
Источник
CI: Linting errors from flake >= 3.8.1 #34150
The new version of flake bumps the version of pycodestyle, which results in several linting errors on CI. These include:
- (many instances) E741:ambiguous variable name ‘l’
- (many instances) F541:f-string is missing placeholders
- (one or few instances) E721:do not compare types, use ‘isinstance()’
Here the output:
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:
- Pin flake Ignore errors to get build green
- Address F541
- Address E721
- Address E741 (or not?)
The text was updated successfully, but these errors were encountered:
for now i would simply fix the version of flake
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.
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
Ah, alright, makes sense. Will this be left open until you can push flake8 to >3.8.1 ? I’d like to take it when it’s actually possible to move forward with it.
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?
Yep, did feel that addressing E741 was something that had to be done at some point if flake8 is going to be updated.
What would the process be for this though? As far as I can see, all of the E741 errors seem to be naming variables l . If this is a valid naming convention that does not lead to a lack of understanding, is that something we want to change? I would also assume that since it deals with variable names across multiple files, it would be something that’d have to be put to a vote? Sorry if I’m getting a bit ahead here 🙂
Источник
F-Строки: Новый улучшенный способ форматирования строк в Python
У нас для вас хорошие новости: f-строки вступают в дело, чтобы помочь с форматированием. Также известные как «форматированные строковые литералы», f-strings являются строковыми литералами с «f» в начале и фигурные скобки, содержащие выражения, которые в дальнейшем будут заменены своими значениями. Выражения оцениваются по мере выполнения и затем форматируются при помощи протокола __format__ . Как всегда, документация Python может помочь, если хотите узнать больше.
Есть вопросы по Python?
На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!
Telegram Чат & Канал
Вступите в наш дружный чат по Python и начните общение с единомышленниками! Станьте частью большого сообщества!
Паблик VK
Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!
Рассмотрим подробнее, как именно f-strings могут упростить вам жизнь.
Простой синтаксис
Синтаксис аналогичен тому, который вы используете в str.format(), но не такой перегруженный. Посмотрите на эту читабельность:
Вы также можете использовать заглавную букву F:
Вам уже нравится? Надеемся, что да, в любом случае, вы будете в восторге к концу статьи.
Произвольные выражения
Так как f-строки оцениваются по мере выражения, вы можете внести любую или все доступные выражения Python в них. Это позволит вам делать интересные вещи, например следующее:
Также вы можете вызывать функции. Пример:
Также вы можете вызывать метод напрямую:
Вы даже можете использовать объекты, созданные из классов при помощи f-строки. Представим, что у вас есть следующий класс:
Вы могли бы сделать следующее:
Методы __str__() и __repr__() работают с тем, как объекты отображаются в качестве строк, так что вам нужно убедиться в том, что вы используете один из этих методов в вашем определении класса. Если вы хотите выбрать один, попробуйте __repr__(), так как его можно использовать вместо __str__().
Строка, которая возвращается __str__() является неформальным строковым представлением объекта и должна быть читаемой. Строка, которую вернул __str__() — это официальное выражение и должно быть однозначным. При вызове str() и repr(), предпочтительнее использовать __str__() и __repr__() напрямую.
По умолчанию, f-строки будут использовать __str__(), но вы должны убедиться в том, что они используют __repr__(), если вы включаете флаг преобразования !r:
Если вы хотите прочитать часть обсуждения, в результате которого f-strings поддерживают полные выражения Python, вы можете сделать это здесь.
Многострочные F-Strings
У вас могут быть многострочные f-strings:
Однако помните о том, что вам нужно разместить f вначале каждой строки. Следующий код не будет работать:
Если вы не внесете f в начале каждой индивидуальной строки, то получите обычную, старую версию строк, без приятных новшеств.
Если вы хотите размножить строки по нескольким линиям, у вас также есть возможность избежать возвратов при помощи :
Но вот что произойдет, если вы используете «»»:
Инструкция по отступам доступна в PEP 8.
Скорость
Буква f в f-strings может также означать и “fast”. Наши f-строки заметно быстрее чем % и str.format() форматирования. Как мы уже видели, f-строки являются выражениями, которые оцениваются по мере выполнения, а не постоянные значения. Вот выдержка из документации:
“F-Строки предоставляют способ встраивания выражений внутри строковых литералов с минимальным синтаксисом. Стоит обратить внимание на то, что f-строка является выражением, которое оценивается по мере выполнения, а не постоянным значением. В исходном коде Python f-строки является литеральной строкой с префиксом f, которая содержит выражения внутри скобок. Выражения заменяются их значением.”
Во время выполнения, выражение внутри фигурных скобок оценивается в собственной области видимости Python и затем сопоставляется со строковой литеральной частью f-строки. После этого возвращается итоговая строка. В целом, это все.
Источник