.. _NoNamedTupleRule:

================
NoNamedTupleRule
================

Enforce the use of ``dataclasses.dataclass`` decorator instead of ``NamedTuple`` for cleaner customization and
inheritance. It supports default value, combining fields for inheritance, and omitting optional fields at
instantiation. See `PEP 557 <https://www.python.org/dev/peps/pep-0557>`_.
``@dataclass`` is faster at reading an object's nested properties and executing its methods. (`benchmark <https://medium.com/@jacktator/dataclass-vs-namedtuple-vs-object-for-performance-optimization-in-python-691e234253b9>`_)

-------
Message
-------
Instead of NamedTuple, consider using the @dataclass decorator from dataclasses instead for simplicity, efficiency and consistency.

----------------
Has Autofix: Yes
----------------

-------------------
VALID Code Examples
-------------------

# 1:







.. code-block:: python


    @dataclass(frozen=True)
    class Foo:
        pass





# 2:







.. code-block:: python


    @dataclass(frozen=False)
    class Foo:
        pass





# 3:







.. code-block:: python


    class Foo:
        pass





.. container:: toggle


    # 4:







    .. code-block:: python


        class Foo(SomeOtherBase):
            pass






    # 5:







    .. code-block:: python


        @some_other_decorator
        class Foo:
            pass






    # 6:







    .. code-block:: python


        @some_other_decorator
        class Foo(SomeOtherBase):
            pass






---------------------
INVALID Code Examples
---------------------

# 1:







.. code-block:: python


    from typing import NamedTuple

    class Foo(NamedTuple):
        pass





Autofix:

.. code-block:: python

    --- 
    +++ 
    @@ -1,5 +1,6 @@
 
     from typing import NamedTuple
 
    -class Foo(NamedTuple):
    +@dataclass(frozen=True)
    +class Foo:
         pass

# 2:







.. code-block:: python


    from typing import NamedTuple as NT

    class Foo(NT):
        pass





Autofix:

.. code-block:: python

    --- 
    +++ 
    @@ -1,5 +1,6 @@
 
     from typing import NamedTuple as NT
 
    -class Foo(NT):
    +@dataclass(frozen=True)
    +class Foo:
         pass

# 3:







.. code-block:: python


    import typing as typ

    class Foo(typ.NamedTuple):
        pass





Autofix:

.. code-block:: python

    --- 
    +++ 
    @@ -1,5 +1,6 @@
 
     import typing as typ
 
    -class Foo(typ.NamedTuple):
    +@dataclass(frozen=True)
    +class Foo:
         pass

.. container:: toggle


    # 4:







    .. code-block:: python


        from typing import NamedTuple

        class Foo(NamedTuple, AnotherBase, YetAnotherBase):
            pass





    Autofix:

    .. code-block:: python

        --- 
        +++ 
        @@ -1,5 +1,6 @@
 
         from typing import NamedTuple
 
        -class Foo(NamedTuple, AnotherBase, YetAnotherBase):
        +@dataclass(frozen=True)
        +class Foo(AnotherBase, YetAnotherBase):
             pass


    # 5:







    .. code-block:: python


        from typing import NamedTuple

        class OuterClass(SomeBase):
            class InnerClass(NamedTuple):
                pass





    Autofix:

    .. code-block:: python

        --- 
        +++ 
        @@ -2,5 +2,6 @@
         from typing import NamedTuple
 
         class OuterClass(SomeBase):
        -    class InnerClass(NamedTuple):
        +    @dataclass(frozen=True)
        +    class InnerClass:
                 pass


    # 6:







    .. code-block:: python


        from typing import NamedTuple

        @some_other_decorator
        class Foo(NamedTuple):
            pass





    Autofix:

    .. code-block:: python

        --- 
        +++ 
        @@ -2,5 +2,6 @@
         from typing import NamedTuple
 
         @some_other_decorator
        -class Foo(NamedTuple):
        +@dataclass(frozen=True)
        +class Foo:
             pass

