wemake-services / wemake-python-styleguide

The strictest and most opinionated python linter ever!
https://wemake-python-styleguide.rtfd.io
MIT License
2.49k stars 380 forks source link

WPS610 (async magic) false positive on __aiter__ #2399

Closed Sxderp closed 1 year ago

Sxderp commented 2 years ago

What's wrong

In Python 3.7+ a class __aiter__ must return an async iterator object (an object that implements __anext__). An async generator (an async function with yield) is considered an async iterator object.

The following is valid and should not be flagged as an incorrect async definition.

class Ex(object):
    async def __aiter__(self):
        count = 0
        while count < 50:
            count += 1
            yield count

The following is invalid and should be flagged as incorrect (it'll also throw a type error or somesuch if actually used in async for).

class Ex(object):
    async def __aiter__(self):
        count = 0
        while count < 50:
            count += 1

How it should be

See above. Don't throw an error.

Flake8 version and plugins

{ "dependencies": [], "platform": { "python_implementation": "CPython", "python_version": "3.8.10", "system": "Linux" }, "plugins": [ { "is_local": false, "plugin": "flake8-bandit", "version": "3.0.0" }, { "is_local": false, "plugin": "flake8-broken-line", "version": "0.4.0" }, { "is_local": false, "plugin": "flake8-bugbear", "version": "22.3.23" }, { "is_local": false, "plugin": "flake8-class-attributes-order", "version": "0.1.3" }, { "is_local": false, "plugin": "flake8-comprehensions", "version": "3.8.0" }, { "is_local": false, "plugin": "flake8-darglint", "version": "1.8.1" }, { "is_local": false, "plugin": "flake8-debugger", "version": "4.0.0" }, { "is_local": false, "plugin": "flake8-docstrings", "version": "1.6.0, pydocstyle: 6.1.1" }, { "is_local": false, "plugin": "flake8-eradicate", "version": "1.2.0" }, { "is_local": false, "plugin": "flake8-string-format", "version": "0.3.0" }, { "is_local": false, "plugin": "flake8_commas", "version": "2.1.0" }, { "is_local": false, "plugin": "flake8_isort", "version": "4.1.1" }, { "is_local": false, "plugin": "flake8_quotes", "version": "3.3.1" }, { "is_local": false, "plugin": "mccabe", "version": "0.6.1" }, { "is_local": false, "plugin": "naming", "version": "0.12.1" }, { "is_local": false, "plugin": "pycodestyle", "version": "2.8.0" }, { "is_local": false, "plugin": "pyflakes", "version": "2.4.0" }, { "is_local": false, "plugin": "pylint", "version": "0.0.0" }, { "is_local": false, "plugin": "rst-docstrings", "version": "0.2.5" }, { "is_local": false, "plugin": "wemake_python_styleguide", "version": "0.16.1" } ], "version": "4.0.1" }

pip information

adblockparser==0.7 amkv==0.1.2 anyio==3.5.0 appdirs==1.4.3 apturl==0.5.2 astor==0.8.1 async-generator==1.10 async-timeout==4.0.2 asyncache==0.1.1 atomicwrites==1.1.5 attrs==19.3.0 Automat==0.8.0 bandit==1.7.4 bcrypt==3.1.7 beautifulsoup4==4.11.1 blinker==1.4 Brlapi==0.7.0 Brotli==1.0.9 cachetools==5.0.0 certifi==2019.11.28 cffi==1.14.0 chardet==4.0.0 charset-normalizer==2.0.12 Click==7.0 colorama==0.4.3 command-not-found==0.3 constantly==15.1.0 crit==0.0.1 croniter==1.3.4 cryptography==2.8 cupshelpers==1.0 cycler==0.10.0 Cython==0.29.14 darglint==1.8.1 dblatex===0.3.11py3 dbus-python==1.2.16 decorator==4.4.2 defer==1.0.6 Deprecated==1.2.13 distlib==0.3.0 distro==1.4.0 distro-info===0.23ubuntu1 dnspython==1.16.0 docutils==0.18.1 EditorConfig==0.12.2 entrypoints==0.3 eradicate==2.1.0 et-xmlfile==1.0.1 fasteners==0.14.1 ffmpeg-normalize==1.22.9 ffmpeg-progress-yield==0.2.0 filelock==3.0.12 flake8==4.0.1 flake8-bandit==3.0.0 flake8-broken-line==0.4.0 flake8-bugbear==22.3.23 flake8-class-attributes-order==0.1.3 flake8-commas==2.1.0 flake8-comprehensions==3.8.0 flake8-debugger==4.0.0 flake8-docstrings==1.6.0 flake8-eradicate==1.2.0 flake8-isort==4.1.1 flake8-polyfill==1.0.2 flake8-quotes==3.3.1 flake8-rst-docstrings==0.2.5 flake8-string-format==0.3.0 flakeheaven==0.11.1 funcparserlib==0.3.6 future==0.18.2 gevent==21.12.0 gil-load==0.4.2 gitdb==4.0.9 gitdb2==2.0.6 GitPython==3.1.27 gpg===1.13.1-unknown graphviz==0.16 greenlet==1.1.2 gssapi==1.6.1 h11==0.12.0 h2==4.1.0 h5py==2.10.0 hpack==4.0.0 html5-parser==0.4.10 html5lib==1.0.1 httpcore==0.14.7 httplib2==0.14.0 httpx==0.22.0 hypercorn==0.13.2 hyperframe==6.0.1 hyperlink==19.0.0 idna==2.8 imageio==2.4.1 importlib-metadata==1.5.0 incremental==21.3.0 iotop==0.6 isc==2.0 isort==5.10.1 jdcal==1.0 Jinja2==2.10.1 jsbeautifier==1.10.3 Keras==2.2.4 Keras-Applications==1.0.6 Keras-Preprocessing==1.0.5 keyring==18.0.1 kiwisolver==1.0.1 language-selector==0.1 launchpadlib==1.10.13 lazr.restfulclient==0.14.2 lazr.uri==1.0.3 linecache2==1.0.0 lockfile==0.12.2 louis==3.12.0 lxml==4.5.0 macaroonbakery==1.3.1 Mako==1.1.0 Markdown==3.1.1 MarkupSafe==1.1.0 matplotlib==3.1.2 mccabe==0.6.1 memory-analyzer==0.1.2 meson==0.53.2 mock==3.0.5 monotonic==1.5 more-itertools==4.2.0 mpi4py==3.0.3 msgpack==0.6.2 multidict==6.0.2 mutagen==1.45.1 nest-asyncio==1.5.5 netaddr==0.7.19 netifaces==0.10.4 networkx==2.8 nftables==0.1 nose==1.3.7 numexpr==2.7.1 numpy==1.22.3 oauthlib==3.1.0 objgraph==3.5.0 olefile==0.46 opencv-python==4.5.5.64 openpyxl==3.0.3 outcome==1.1.0 packaging==21.3 pandas==0.25.3 parameterized==0.7.0 paramiko==2.6.0 patsy==0.5.1 pbr==5.4.5 peewee==3.14.10 pep8-naming==0.12.1 pexpect==4.6.0 Pillow==7.0.0 pluggy==0.13.0 ply==3.11 prettytable==2.1.0 priority==1.3.0 protobuf==3.6.1 psutil==5.5.1 py==1.8.1 pyasn1==0.4.2 pyasn1-modules==0.2.1 pycairo==1.16.2 pycodestyle==2.8.0 pycparser==2.19 pycrypto==2.6.1 pycryptodomex==3.14.1 pycups==1.9.73 pydocstyle==6.1.1 pydot==1.4.1 pyflakes==2.4.0 Pygments==2.11.2 PyGObject==3.36.0 pygpu==0.7.6 PyHamcrest==1.9.0 PyJWT==1.7.1 pymacaroons==0.13.0 Pympler==0.9 PyNaCl==1.3.0 pyOpenSSL==19.0.0 pyparsing==3.0.8 PyQt5==5.14.1 PyQtWebEngine==5.14.0 pyRFC3339==1.1 pytest==4.6.9 python-apt==2.0.0+ubuntu0.20.4.6 python-augeas==0.5.0 python-dateutil==2.7.3 python-debian===0.1.36ubuntu1 python-ldap==3.2.0 python-libtorrent==1.1.13 python-multipart==0.0.5 python-yubico==1.3.3 pytz==2019.3 pyusb==1.0.2 PyWavelets==1.3.0 pyxdg==0.26 PyYAML==5.3.1 pyzmq==18.1.1 qrtools==2.0 qt5reactor==0.6 QtPy==1.9.0 redis==4.2.2 reportlab==3.5.34 requests==2.27.1 requests-unixsocket==0.2.0 restructuredtext-lint==1.4.0 rfc3986==1.3.2 salt==3000.2 scikit-image==0.19.2 scipy==1.8.0 seaborn==0.10.0 SecretStorage==2.3.1 selinux==3.0 service-identity==18.1.0 simplejson==3.16.0 sip==4.19.21 six==1.14.0 slip==0.6.5 slip.dbus==0.6.5 smmap==5.0.0 smmap2==2.0.5 sniffio==1.1.0 snowballstemmer==2.0.0 sortedcontainers==2.1.0 soupsieve==1.9.5 splash==3.5 ssh-import-id==5.10 starlette==0.19.0 stevedore==1.32.0 systemd-python==234 tables==3.6.1 testfixtures==6.10.1 testresources==2.0.0 Theano==1.0.4 tifffile==2022.4.8 toml==0.10.0 tqdm==4.64.0 traceback2==1.4.0 trio==0.20.0 Twisted==22.4.0 typing-extensions==4.2.0 ubuntu-advantage-tools==27.4 ubuntu-drivers-common==0.0.0 unattended-upgrades==0.1 unittest2==1.1.0 urllib3==1.26.9 usb-creator==0.3.7 virtualenv==20.0.17 wadllib==1.3.3 wcwidth==0.1.8 webencodings==0.5.1 websockets==10.3 wemake-python-styleguide==0.16.1 Werkzeug==2.1.1 wrapt==1.14.0 wsproto==1.1.0 xdis==6.0.3 xkit==0.0.0 xlrd==1.1.0 xlwt==1.3.0 xvfbwrapper==0.2.9 yarl==1.7.2 youtube-dl==2021.12.17 yt-dlp==2022.4.8 zipp==1.0.0 zope.event==4.5.0 zope.interface==4.7.1

OS information

Ubuntu 20.04

sobolevn commented 2 years ago

PR is welcome!