https://github.com/wemake-services/wemake-python-styleguide/issues/3404
#ast #wemake_python_styleguide
#ast #wemake_python_styleguide
GitHub
Forbid comments in `f` and `t` string · Issue #3404 · wemake-services/wemake-python-styleguide
This code should raise a violation: >>> x = f'{ 1 # comment ... }' Because comments make f string implicilty multiline. And comments must not be present in strings. This is not right.
👍1
https://github.com/wemake-services/wemake-python-styleguide/issues/3413
#wemake_python_styleguide #ast
#wemake_python_styleguide #ast
GitHub
WPS212 counts return-statements from inner definitions · Issue #3413 · wemake-services/wemake-python-styleguide
What's wrong def foobar() -> Any: def inner_func(x: Any) -> Any: return x class Foobar: def __init__(self: Self): self.x = 1 def get_x(self: Self) -> int: return self.x return inner_fu...
https://github.com/wemake-services/wemake-python-styleguide/issues/3458
#python #wemake_python_styleguide #ast
#python #wemake_python_styleguide #ast
GitHub
Forbid "fat" finally · Issue #3458 · wemake-services/wemake-python-styleguide
Rule request Allow finally block to have simple content only. It can contain few lines of code, but it shouldn't contain untrivial logic, which can not be understand very quickly at code readin...
😭5❤2
https://github.com/wemake-services/wemake-python-styleguide/issues/2340
#wemake_python_styleguide #ast
#wemake_python_styleguide #ast
GitHub
Detect leaking `for` loops in `ClassDef` and `Module` · Issue #2340 · wemake-services/wemake-python-styleguide
Right now we can have two problems: class Some(object): for x in [1, 2]: print(x) print(Some.x) # oups, will show you `2` and with modules: # some.py for x in [1, 2]: print(x) # __main__ import som...
👍3❤1
https://github.com/wemake-services/wemake-python-styleguide/issues/3493
#ast #wemake_python_styleguide
#ast #wemake_python_styleguide
GitHub
Make `WPS222` configurable · Issue #3493 · wemake-services/wemake-python-styleguide
Currently we use MAX_CONDITIONS: Final = 4 as a constant in constants.py. There's no way to configure MAX_CONDITIONS. However, there might be projects where 5 or even 8 might be reasonable. So,...
👎1
https://github.com/wemake-services/wemake-python-styleguide/issues/3500
#ast #wemake_python_styleguide
#ast #wemake_python_styleguide
GitHub
Allow set comprehensions in `WPS335` · Issue #3500 · wemake-services/wemake-python-styleguide
We don't allow list and set to be used as iterable parts of for, because we only allow tuples there. We need to allow SetComp in for iterable: 118:22 WPS335 Found incorrect `for` loop iter type...
Не самая простая задача, но прикольная: https://github.com/wemake-services/wemake-python-styleguide/issues/3501
Подойдет тем, кто уже делает не первый PR :)
#ast #wemake_python_styleguide
Подойдет тем, кто уже делает не первый PR :)
#ast #wemake_python_styleguide
GitHub
False positive for `WPS529` · Issue #3501 · wemake-services/wemake-python-styleguide
Code like this def func(**kwargs): if 'a' in kwargs: assert 'a_kwargs' not in kwargs else: kwargs['a'] = other( **kwargs.pop('a_kwargs', {}), ) raises WPS529 I don&#...
https://github.com/wemake-services/wemake-python-styleguide/issues/3506
Поправить описание того, что мы считаем "сложным" кодом внутри
#wemake_python_styleguide #docs
Поправить описание того, что мы считаем "сложным" кодом внутри
f строк#wemake_python_styleguide #docs
GitHub
False positive for `WPS237` · Issue #3506 · wemake-services/wemake-python-styleguide
What's wrong I encountered this error in one of my functions for a game on Pygame, and after reviewing the WPS documentation, I believe it is a false positive. Please review the function yourse...
🚀 New issue to wemake-services/wemake-python-styleguide by @luminoso
📝 False positive for WPS457 when using asyncio to control loops (#3573)
What's wrong
For the code:
WPS457: Found an infinite while loop is raised. But infinite loop is being handled. Just not within the while loop.
How it should be
Not to raise WPS457.
Not 100% sure here if it is the best practice or not.
Also probably the solution is too complex and is just easier to add a
Flake8 version and plugins
pip information
OS information
#bug #help_wanted #levelstarter #good_first_issue #wemake_python_styleguide #wps
sent via relator
📝 False positive for WPS457 when using asyncio to control loops (#3573)
What's wrong
For the code:
import asyncio
async def infinite_loop() -> None:
try:
while True:
await asyncio.sleep(1)
print("I'm alive. And doing work.")
except asyncio.CancelledError:
print("Loop cancelled")
t = asyncio.create_task(infinite_loop())
await asyncio.sleep(5)
t.cancel()
WPS457: Found an infinite while loop is raised. But infinite loop is being handled. Just not within the while loop.
How it should be
Not to raise WPS457.
Not 100% sure here if it is the best practice or not.
Also probably the solution is too complex and is just easier to add a
noqa in the code.Flake8 version and plugins
{
"platform": {
"python_implementation": "CPython",
"python_version": "3.13.9",
"system": "Linux"
},
"plugins": [
{
"plugin": "mccabe",
"version": "0.7.0"
},
{
"plugin": "pycodestyle",
"version": "2.14.0"
},
{
"plugin": "pyflakes",
"version": "3.4.0"
},
{
"plugin": "wemake-python-styleguide",
"version": "1.4.0"
}
],
"version": "7.3.0"
}
pip information
pip 25.3 from /var/home/luminoso/.local/lib/python3.14/site-packages/pip (python 3.14)
anyio==4.11.0
archspec==0.2.5
argcomplete==3.6.3
asttokens==3.0.0
attrs==25.4.0
boto3==1.42.4
botocore==1.42.4
Brlapi==0.8.7
Brotli==1.1.0
certifi==2025.7.9
charset-normalizer==3.4.3
click==8.1.7
conda==25.11.0
conda-package-handling==2.4.0
conda_package_streaming==0.11.0
cupshelpers==1.0
dasbus==1.7
dbus-python==1.4.0
decorator==5.2.1
distro==1.9.0
executing==2.2.1
fedora-third-party==0.10
file-magic==0.4.0
frozendict==2.4.6
gbinder-python==1.1.2
h11==0.16.0
httpcore==1.0.9
httpx==0.28.1
idna==3.10
ipython==8.37.0
jedi==0.19.2
jmespath==1.0.1
jsonpatch==1.33
jsonpointer==2.4
jsonschema==4.23.0
jsonschema-specifications==2024.10.1
langtable==0.0.69
louis==3.33.0
matplotlib-inline==0.1.7
menuinst==2.3.1
mercurial==7.1.1
mutagen==1.47.0
nftables==0.1
olefile==0.47
packaging==25.0
parso==0.8.5
pexpect==4.9.0
pillow==11.3.0
platformdirs==4.2.2
pluggy==1.6.0
progressbar2==4.5.0
prompt_toolkit==3.0.41
psutil==7.0.0
ptyprocess==0.7.0
pure_eval==0.2.3
PyAudio==0.2.13
pycairo==1.28.0
pyclip==0.7.0
pycosat==0.6.6
pycryptodomex==3.23.0
pycups==2.0.4
pyenchant==3.2.2
pygdbmi==0.11.0.0
Pygments==2.19.1
PyGObject==3.54.5
pyinotify==0.9.6
PySocks==1.7.1
python-dateutil==2.9.0.post0
python-linux-procfs==0.7.3
python-utils==3.9.1
pyudev==0.24.3
pyxdg==0.27
PyYAML==6.0.2
pyynl @ file:///builddir/build/BUILD/kernel-6.17.10-build/kernel-6.17.10/linux-6.17.10-300.fc43.x86_64/tools/net/ynl
RapidFuzz==3.12.2
referencing==0.36.2
regex==2025.10.23
requests==2.32.5
rpds-py==0.27.0
rpm==6.0.0
rpmautospec==0.8.3
rpmautospec-core==0.1.5
ruamel.yaml==0.18.16
ruamel.yaml.clib==0.2.12
s3transfer==0.16.0
selinux @ file:///builddir/build/BUILD/libselinux-3.9-build/libselinux-3.9/src
sentry-sdk==2.35.0
sepolicy @ file:///builddir/build/BUILD/policycoreutils-3.9-build/selinux-3.9/python/sepolicy
setools==4.6.0
setuptools==78.1.1
six==1.17.0
sniffio==1.3.1
sos==4.10.1
stack_data==0.6.3
tqdm==4.67.1
traitlets==5.14.3
typing_extensions==4.15.0
urllib3==2.5.0
wcwidth==0.2.13
websockets==15.0.1
yt-dlp==2025.10.22
zstandard==0.25.0
OS information
$ lsb_release -a
LSB Version: n/a
Distributor ID: Fedora
Description: Fedora Linux 43.20251209.0 (Kinoite)
Release: 43
Codename: n/a
#bug #help_wanted #levelstarter #good_first_issue #wemake_python_styleguide #wps
sent via relator
❤1
🚀 New issue to wemake-services/wemake-python-styleguide by @sobolevn
📝 False positive for `WPS430` with whitelisted name (#3589)
This code falsy raises two
But, the name is correct.
We need to fix it and add a test case.
#bug #help_wanted #levelstarter #good_first_issue #wemake_python_styleguide #wps
sent via relator
📝 False positive for `WPS430` with whitelisted name (#3589)
def wrap_handler(
method: _MethodSyncHandler | _MethodAsyncHandler,
) -> SyncErrorHandlerT | AsyncErrorHandlerT:
if inspect.iscoroutinefunction(method):
@wraps(method)
async def decorator(
endpoint: 'Endpoint',
controller: 'Controller[BaseSerializer]',
exc: Exception,
) -> HttpResponse:
return await method( # type: ignore[no-any-return]
controller.active_blueprint,
endpoint,
controller,
exc,
)
else:
@wraps(method)
def decorator(
endpoint: 'Endpoint',
controller: 'Controller[BaseSerializer]',
exc: Exception,
) -> HttpResponse:
return method( # type: ignore[return-value]
controller.active_blueprint,
endpoint,
controller,
exc,
)
return decorator
This code falsy raises two
WPS430 violations.69:9 WPS430 Found nested function: factory
async def factory(
^
84:9 WPS430 Found nested function: factory
def factory(
^
But, the name is correct.
decorator name is in whitelist of names. This is a false positive.We need to fix it and add a test case.
#bug #help_wanted #levelstarter #good_first_issue #wemake_python_styleguide #wps
sent via relator
🚀 New issue to wemake-services/wemake-python-styleguide by @sobolevn
📝 `WPS617` false positive with keyword args (#3596)
It says:
Which is clearly a bug, it is a named param, not an attribute.
PRs are welcome, this is easy to fix.
#bug #help_wanted #levelstarter #good_first_issue #wemake_python_styleguide #wps
sent via relator
📝 `WPS617` false positive with keyword args (#3596)
self._media_by_precedence = sorted(
(
media_type
for parser in self._parsers.values()
if (media_type := MediaType(parser.content_type)).quality != 0
),
key=lambda media: (media.specificity, media.quality), # noqa: WPS617
reverse=True,
)
It says:
django_modern_rest/negotiation.py
52:17 WPS617 Found lambda assigned as an attribute
key=lambda media: (media.specificity, media.quality),
^
Which is clearly a bug, it is a named param, not an attribute.
PRs are welcome, this is easy to fix.
#bug #help_wanted #levelstarter #good_first_issue #wemake_python_styleguide #wps
sent via relator
🚀 New issue to wemake-services/wemake-python-styleguide by @sobolevn
📝 Remove `WPS354` (#3601)
This rules has more problems that it solves:
1. Two
2. Async iterators cannot use
So, it is time to remove this rule. I was wrong about that :(
See other rules with
#feature #help_wanted #levelstarter #good_first_issue #wemake_python_styleguide #wps
sent via relator
📝 Remove `WPS354` (#3601)
This rules has more problems that it solves:
1. Two
yields and yield from are two different things2. Async iterators cannot use
yield from, but WPS354 still raises even in async defSo, it is time to remove this rule. I was wrong about that :(
See other rules with
disabled_since attribute on how to disable a rule.#feature #help_wanted #levelstarter #good_first_issue #wemake_python_styleguide #wps
sent via relator
🫡1
🚀 New issue to wemake-services/wemake-python-styleguide by @sobolevn
📝 `WPS457` false positive with `while` in `try` / `except` (#3603)
I have the following code:
It should not raise
It can clearly raise and we handle the error. So, it is not infinite.
PRs are welcome! 👍
#bug #help_wanted #levelstarter #good_first_issue #wemake_python_styleguide #wps
sent via relator
📝 `WPS457` false positive with `while` in `try` / `except` (#3603)
I have the following code:
def factory() -> Iterator[bytes]:
try:
while True: # noqa: WPS457
yield async_to_sync(async_anext)(iterator)
except StopAsyncIteration:
pass
It should not raise
WPS457, because while is in try / except.It can clearly raise and we handle the error. So, it is not infinite.
PRs are welcome! 👍
#bug #help_wanted #levelstarter #good_first_issue #wemake_python_styleguide #wps
sent via relator
🚀 New issue to wemake-services/wemake-python-styleguide by @sobolevn
📝 Add `llms.txt` and `llms-full.txt` (#3619)
Let's add
It will generate
Plugin: https://github.com/wemake-services/django-modern-rest/blob/048bfa4e19f897a6ca9fbae63af14df56882b991/docs/conf.py#L72
Configuration: https://github.com/wemake-services/django-modern-rest/blob/048bfa4e19f897a6ca9fbae63af14df56882b991/docs/conf.py#L256-L258
#help_wanted #levelstarter #documentation #good_first_issue #wemake_python_styleguide #wps
sent via relator
📝 Add `llms.txt` and `llms-full.txt` (#3619)
Let's add
sphinx_llms_txt extension for the WPS: https://sphinx-llms-txt.readthedocs.io/en/latest/It will generate
llms.txt and llms-full.txtPlugin: https://github.com/wemake-services/django-modern-rest/blob/048bfa4e19f897a6ca9fbae63af14df56882b991/docs/conf.py#L72
Configuration: https://github.com/wemake-services/django-modern-rest/blob/048bfa4e19f897a6ca9fbae63af14df56882b991/docs/conf.py#L256-L258
#help_wanted #levelstarter #documentation #good_first_issue #wemake_python_styleguide #wps
sent via relator
🚀 New issue to wemake-services/wemake-python-styleguide by @sobolevn
📝 Build a MCP extra (#3770)
We need to add an MCP protocol support to wemake-python-styleguide.
It should be installed with
What should it do? Provide the same output as
But, tool call is much more expensive than an MCP call.
CC @Khabib73
#feature #help_wanted #levelstarter #good_first_issue #wemake_python_styleguide #wps
sent via relator
📝 Build a MCP extra (#3770)
We need to add an MCP protocol support to wemake-python-styleguide.
It should be installed with
wemake-python-styleguide[mcp] and advertised in the readme.What should it do? Provide the same output as
wps explain WPSXXX.But, tool call is much more expensive than an MCP call.
CC @Khabib73
#feature #help_wanted #levelstarter #good_first_issue #wemake_python_styleguide #wps
sent via relator
🚀 New issue to wemake-services/wemake-python-styleguide by @Novohudonossor
📝 tstring_same_prefix params contain f-strings — the t-string coverage from #3702 is never exercised (#3793)
What's wrong
Two test constants touched by #3702 ("extend f-string rules to t-strings") do not exercise t-strings at all.
1.
The snippet is identical to
2.
How it should be
1.
2.
Happy to open a PR for both if that is useful.
Flake8 version and plugins / pip information / OS information
Not applicable — this is not a runtime report. Found by reading the tests, verified against HEAD
Provenance
Both came out of a review run with ReviewGate (https://reviewgate.dev), a local review gate I build, over
#bug #help_wanted #levelstarter #good_first_issue #wemake_python_styleguide #wps
sent via relator
📝 tstring_same_prefix params contain f-strings — the t-string coverage from #3702 is never exercised (#3793)
What's wrong
Two test constants touched by #3702 ("extend f-string rules to t-strings") do not exercise t-strings at all.
1.
tests/test_visitors/test_ast/test_complexity/test_overuses/test_overused_string.py:112-131tstring_same_prefix1 = pytest.param(
"""
x = f'Hello, {pattern}'
y = f'Hello, {pattern}'
""",
marks=pytest.mark.skipif(not PY314, reason='t-strings are only in Python 3.14+'),
)
The snippet is identical to
fstring_same_prefix1 right above it. Below 3.14 the param is skipped by the mark; on 3.14+ it runs and asserts on f-strings. Either way WPS226 is never checked against a t-string, and the suite stays green.2.
tests/test_visitors/test_tokenize/test_comments/test_comment_in_formatted_string312.py:87PREFIXES is ['f', 't'] and both tests run code.format(prefix), so every constant is exercised twice. rfstring_with_comment_triple_single_quotes hardcodes rf'''…''' instead of r{0}'''…''' like its two siblings above it, so the t round re-tests rf.How it should be
1.
t'Hello, {pattern}' and t'{pattern}-postfix' inside the two tstring_same_prefix* params.2.
r{0}'''test{{a # comment\n}}''', matching rfstring_with_comment_single_quotes and rfstring_with_comment_triple_quotes.Happy to open a PR for both if that is useful.
Flake8 version and plugins / pip information / OS information
Not applicable — this is not a runtime report. Found by reading the tests, verified against HEAD
8ebc607; there is no flake8 --bug-report output to paste.Provenance
Both came out of a review run with ReviewGate (https://reviewgate.dev), a local review gate I build, over
76b3ac3~1..c580fc3. The run was local, on my own model key, and nothing left my machine.#bug #help_wanted #levelstarter #good_first_issue #wemake_python_styleguide #wps
sent via relator
🚀 New issue to wemake-services/wemake-python-styleguide by @sobolevn
📝 Do not count docstrings for `WPS226` (#3803)
I just got this, where
This is not right.
#bug #help_wanted #levelstarter #good_first_issue #wemake_python_styleguide #wps
sent via relator
📝 Do not count docstrings for `WPS226` (#3803)
dmr/security/jwt/views.py
155:9 WPS226 Found string literal over-use: 'Lazy endpoint spec.' 6 > 3
"""Lazy endpoint spec."""
^
I just got this, where
"""Lazy endpoint spec.""" is an actual docstring.This is not right.
#bug #help_wanted #levelstarter #good_first_issue #wemake_python_styleguide #wps
sent via relator
🚀 New issue to wemake-services/wemake-python-styleguide by @sobolevn
📝 Incorrect Jones complexity for formatted strings (#3820)
These two lines:
•
•
have different Jones complexity.
They must not. It should be counted as:
• 1 per every
• As regular for all python expressions inside
• All string parts of fstring are counted as total of 1
#bug #help_wanted #levelstarter #good_first_issue #wemake_python_styleguide #wps
sent via relator
📝 Incorrect Jones complexity for formatted strings (#3820)
These two lines:
•
tuple(f'/{pref.strip("/")}/' for pref in (prefix, *prefixes))•
tuple(f'/{pref.strip("/")}' for pref in (prefix, *prefixes)) (notice the missing / at the end)have different Jones complexity.
They must not. It should be counted as:
• 1 per every
{}• As regular for all python expressions inside
{}• All string parts of fstring are counted as total of 1
#bug #help_wanted #levelstarter #good_first_issue #wemake_python_styleguide #wps
sent via relator
🚀 New issue to wemake-services/wemake-python-styleguide by @sobolevn
📝 `WPS235`: ignore imports from `typing` (#3824)
I can't limit the number of types I import from
We need to just ignore this module. And
#bug #help_wanted #levelstarter #good_first_issue #wemake_python_styleguide #wps
sent via relator
📝 `WPS235`: ignore imports from `typing` (#3824)
I can't limit the number of types I import from
typing, I can't refactor types to use typing. prefix and import import typingWe need to just ignore this module. And
typing_extensions as well.#bug #help_wanted #levelstarter #good_first_issue #wemake_python_styleguide #wps
sent via relator
🚀 New issue to wemake-services/wemake-python-styleguide by @sobolevn
📝 Move skills into the `wemake_python_styleguide` folder (#3842)
https://library-skills.io requires skills to be in the source folder, see https://github.com/wemake-services/django-modern-rest/tree/master/dmr/.agents/skills
Let's move them there :)
#help_wanted #levelstarter #good_first_issue #wemake_python_styleguide #wps
sent via relator
📝 Move skills into the `wemake_python_styleguide` folder (#3842)
https://library-skills.io requires skills to be in the source folder, see https://github.com/wemake-services/django-modern-rest/tree/master/dmr/.agents/skills
Let's move them there :)
#help_wanted #levelstarter #good_first_issue #wemake_python_styleguide #wps
sent via relator