Skip to content
New issue

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

Crash with dataclass enums #9100

Closed
Gunni opened this issue Oct 3, 2023 · 2 comments · Fixed by #9104 or #9461
Closed

Crash with dataclass enums #9100

Gunni opened this issue Oct 3, 2023 · 2 comments · Fixed by #9104 or #9461
Labels
Crash 💥 A bug that makes pylint crash
Milestone

Comments

@Gunni
Copy link

Gunni commented Oct 3, 2023

Bug description

When parsing the following a.py:

from dataclasses import dataclass
from enum import Enum


@dataclass
class Something(str, Enum):
	asd: str = 'sdf'

Configuration

No response

Command used

pylint a.py

Pylint output

<details open>
    <summary>
        pylint crashed with a ``AstroidError`` and with the following stacktrace:
    </summary>


Traceback (most recent call last):
  File "/somewhere/test_pylint_enum/.venv/lib64/python3.11/site-packages/pylint/lint/pylinter.py", line 788, in _lint_file
    check_astroid_module(module)
  File "/somewhere/test_pylint_enum/.venv/lib64/python3.11/site-packages/pylint/lint/pylinter.py", line 1017, in check_astroid_module
    retval = self._check_astroid_module(
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/somewhere/test_pylint_enum/.venv/lib64/python3.11/site-packages/pylint/lint/pylinter.py", line 1069, in _check_astroid_module
    walker.walk(node)
  File "/somewhere/test_pylint_enum/.venv/lib64/python3.11/site-packages/pylint/utils/ast_walker.py", line 94, in walk
    self.walk(child)
  File "/somewhere/test_pylint_enum/.venv/lib64/python3.11/site-packages/pylint/utils/ast_walker.py", line 94, in walk
    self.walk(child)
  File "/somewhere/test_pylint_enum/.venv/lib64/python3.11/site-packages/pylint/utils/ast_walker.py", line 94, in walk
    self.walk(child)
  File "/somewhere/test_pylint_enum/.venv/lib64/python3.11/site-packages/pylint/utils/ast_walker.py", line 91, in walk
    callback(astroid)
  File "/somewhere/test_pylint_enum/.venv/lib64/python3.11/site-packages/pylint/checkers/base/name_checker/checker.py", line 488, in visit_assignname
    if utils.is_enum_member(node) or utils.is_assign_name_annotated_with(
       ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/somewhere/test_pylint_enum/.venv/lib64/python3.11/site-packages/pylint/checkers/utils.py", line 2284, in is_enum_member
    enum_member_objects = frame.locals.get("__members__")[0].items
                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^
TypeError: 'NoneType' object is not subscriptable

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/somewhere/test_pylint_enum/.venv/lib64/python3.11/site-packages/pylint/lint/pylinter.py", line 752, in _lint_files
    self._lint_file(fileitem, module, check_astroid_module)
  File "/somewhere/test_pylint_enum/.venv/lib64/python3.11/site-packages/pylint/lint/pylinter.py", line 790, in _lint_file
    raise astroid.AstroidError from e
astroid.exceptions.AstroidError




</details>

Expected behavior

No crash. Works on 2.17.7.

Pylint version

pylint 3.0.0
astroid 3.0.0
Python 3.11.5 (main, Aug 28 2023, 00:00:00) [GCC 13.2.1 20230728 (Red Hat 13.2.1-1)]

OS / Environment

NAME="Fedora Linux"
VERSION="38 (Workstation Edition)"

Additional dependencies

No response

@Gunni Gunni added the Needs triage 📥 Just created, needs acknowledgment, triage, and proper labelling label Oct 3, 2023
@Pierre-Sassoulas Pierre-Sassoulas added Crash 💥 A bug that makes pylint crash Needs investigation 🔬 A bug or crash where it's not immediately obvious what is happenning and removed Needs triage 📥 Just created, needs acknowledgment, triage, and proper labelling labels Oct 3, 2023
@mbyrnepr2
Copy link
Member

Thanks Gunni for the catch!
@Pierre-Sassoulas our handling of data classes seems to interfere in this situation because the __members__ object is not present anymore. It doesn't happen when other decorators are used instead of dataclass.

So, as a way forward, how about we catch the TypeError for this scenario in pylint and independently create an issue in astroid to be able to understand dataclass + enum classes?

@Pierre-Sassoulas
Copy link
Member

I think it depends on the difficulty of the fix in astroid. If it's very hard then sure let's prevent the crash temporarily in pylint with a try/except.

mbyrnepr2 added a commit to mbyrnepr2/pylint that referenced this issue Oct 3, 2023
mbyrnepr2 added a commit to mbyrnepr2/pylint that referenced this issue Oct 3, 2023
Pierre-Sassoulas pushed a commit that referenced this issue Oct 4, 2023
* Fix a crash when an enum class which is also decorated with a ``dataclasses.dataclass`` decorator is defined.

Closes #9100

* Update test to mention the `astroid` issue that addresses the missing ``__members__`` object.

* Use an `if` instead of the `try/except` block.

* Update pylint/checkers/utils.py

Co-authored-by: Daniël van Noord <13665637+DanielNoord@users.noreply.github.com>

---------

Co-authored-by: Daniël van Noord <13665637+DanielNoord@users.noreply.github.com>
github-actions bot pushed a commit that referenced this issue Oct 4, 2023
* Fix a crash when an enum class which is also decorated with a ``dataclasses.dataclass`` decorator is defined.

Closes #9100

* Update test to mention the `astroid` issue that addresses the missing ``__members__`` object.

* Use an `if` instead of the `try/except` block.

* Update pylint/checkers/utils.py

Co-authored-by: Daniël van Noord <13665637+DanielNoord@users.noreply.github.com>

---------

Co-authored-by: Daniël van Noord <13665637+DanielNoord@users.noreply.github.com>
(cherry picked from commit 2c3425d)
Pierre-Sassoulas added a commit that referenced this issue Oct 4, 2023
* Fix a crash when an enum class which is also decorated with a ``dataclasses.dataclass`` decorator is defined.

Closes #9100

* Update test to mention the `astroid` issue that addresses the missing ``__members__`` object.

* Use an `if` instead of the `try/except` block.

* Update pylint/checkers/utils.py

Co-authored-by: Daniël van Noord <13665637+DanielNoord@users.noreply.github.com>

---------

Co-authored-by: Daniël van Noord <13665637+DanielNoord@users.noreply.github.com>
(cherry picked from commit 2c3425d)

Co-authored-by: Mark Byrne <31762852+mbyrnepr2@users.noreply.github.com>
Co-authored-by: Pierre Sassoulas <pierre.sassoulas@gmail.com>
@Pierre-Sassoulas Pierre-Sassoulas added this to the 3.0.1 milestone Oct 5, 2023
@Pierre-Sassoulas Pierre-Sassoulas removed the Needs investigation 🔬 A bug or crash where it's not immediately obvious what is happenning label Oct 5, 2023
netbsd-srcmastr referenced this issue in NetBSD/pkgsrc Mar 3, 2024
New Features
------------

- Skip ``consider-using-join`` check for non-empty separators if an ``suggest-join-with-non-empty-separator`` option is set to ``no``.

  Closes #8701 (`#8701 <https://github.com/pylint-dev/pylint/issues/8701>`_)

- Discover ``.pyi`` files when linting.

  These can be ignored with the ``ignore-patterns`` setting.

  Closes #9097 (`#9097 <https://github.com/pylint-dev/pylint/issues/9097>`_)

- Check ``TypeAlias`` and ``TypeVar`` (PEP 695) nodes for ``invalid-name``.

  Refs #9196 (`#9196 <https://github.com/pylint-dev/pylint/issues/9196>`_)

- Support for resolving external toml files named pylintrc.toml and .pylintrc.toml.

  Closes #9228 (`#9228 <https://github.com/pylint-dev/pylint/issues/9228>`_)

- Check for `.clear`, `.discard`, `.pop` and `remove` methods being called on a set while it is being iterated over.

  Closes #9334 (`#9334 <https://github.com/pylint-dev/pylint/issues/9334>`_)



New Checks
----------

- New message `use-yield-from` added to the refactoring checker. This message is emitted when yielding from a loop can be replaced by `yield from`.

  Closes #9229. (`#9229 <https://github.com/pylint-dev/pylint/issues/9229>`_)

- Added a ``deprecated-attribute`` message to check deprecated attributes in the stdlib.

  Closes #8855 (`#8855 <https://github.com/pylint-dev/pylint/issues/8855>`_)


False Positives Fixed
---------------------

- Fixed false positive for ``inherit-non-class`` for generic Protocols.

  Closes #9106 (`#9106 <https://github.com/pylint-dev/pylint/issues/9106>`_)

- Exempt ``TypedDict`` from ``typing_extensions`` from ``too-many-ancestor`` checks.

  Refs #9167 (`#9167 <https://github.com/pylint-dev/pylint/issues/9167>`_)



False Negatives Fixed
---------------------

- Extend broad-exception-raised and broad-exception-caught to except*.

  Closes #8827 (`#8827 <https://github.com/pylint-dev/pylint/issues/8827>`_)

- Fix a false-negative for unnecessary if blocks using a different than expected ordering of arguments.

  Closes #8947. (`#8947 <https://github.com/pylint-dev/pylint/issues/8947>`_)



Other Bug Fixes
---------------

- Improve the message provided for wrong-import-order check.  Instead of the import statement ("import x"), the message now specifies the import that is out of order and which imports should come after it.  As reported in the issue, this is particularly helpful if there are multiple imports on a single line that do not follow the PEP8 convention.

  The message will report imports as follows:
  For "import X", it will report "(standard/third party/first party/local) import X"
  For "import X.Y" and "from X import Y", it will report "(standard/third party/first party/local) import X.Y"
  The import category is specified to provide explanation as to why pylint has issued the message and guidence to the developer on how to fix the problem.

  Closes #8808 (`#8808 <https://github.com/pylint-dev/pylint/issues/8808>`_)



Other Changes
-------------

- Print how many files were checked in verbose mode.

  Closes #8935 (`#8935 <https://github.com/pylint-dev/pylint/issues/8935>`_)

- Fix a crash when an enum class which is also decorated with a ``dataclasses.dataclass`` decorator is defined.

  Closes #9100 (`#9100 <https://github.com/pylint-dev/pylint/issues/9100>`_)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Crash 💥 A bug that makes pylint crash
Projects
None yet
3 participants