no-named-tuple

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. @dataclass is faster at reading an object’s nested properties and executing its methods.

Message

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

References

Valid examples

@dataclass(frozen=True)
class Foo:
    pass
@dataclass(frozen=False)
class Foo:
    pass
Show more
class Foo:
    pass
class Foo(SomeOtherBase):
    pass
@some_other_decorator
class Foo:
    pass
@some_other_decorator
class Foo(SomeOtherBase):
    pass
from typing import NamedTuple as NT

Other = NT

Invalid examples

from typing import NamedTuple

class Foo(NamedTuple):
    pass

Suggested fix

import dataclasses

@dataclasses.dataclass(frozen=True)
class Foo:
    pass
Show more
from typing_extensions import NamedTuple

class Foo(NamedTuple):
    pass

Suggested fix

import dataclasses

@dataclasses.dataclass(frozen=True)
class Foo:
    pass
from typing import NamedTuple as NT

class Foo(NT):
    pass

Suggested fix

import dataclasses

@dataclasses.dataclass(frozen=True)
class Foo:
    pass
import typing as typ

class Foo(typ.NamedTuple):
    pass

Suggested fix

import dataclasses
import typing as typ

@dataclasses.dataclass(frozen=True)
class Foo:
    pass
from typing import NamedTuple

class Foo(NamedTuple, AnotherBase, YetAnotherBase):
    pass

Suggested fix

import dataclasses

@dataclasses.dataclass(frozen=True)
class Foo(AnotherBase, YetAnotherBase):
    pass
from typing import NamedTuple

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

Suggested fix

import dataclasses

class OuterClass(SomeBase):
    @dataclasses.dataclass(frozen=True)
    class InnerClass:
        pass
from typing import NamedTuple

@some_other_decorator
class Foo(NamedTuple):
    pass

Suggested fix

import dataclasses

@some_other_decorator
@dataclasses.dataclass(frozen=True)
class Foo:
    pass
from dataclasses import dataclass
from typing import NamedTuple

class Foo(NamedTuple):
    pass

Suggested fix

from dataclasses import dataclass

@dataclass(frozen=True)
class Foo:
    pass
import dataclasses as dc
from typing import NamedTuple

class Foo(NamedTuple):
    pass

Suggested fix

import dataclasses as dc

@dc.dataclass(frozen=True)
class Foo:
    pass
from collections import namedtuple

Point = namedtuple("Point", ["x", "y"])
from typing import NamedTuple

Point = NamedTuple("Point", [("x", int), ("y", int)])
from typing_extensions import NamedTuple

Point = NamedTuple("Point", [("x", int), ("y", int)])
from typing import NamedTuple as NT

Point = NT("Point", [("x", int), ("y", int)])
import typing

Point = typing.NamedTuple("Point", [("x", int), ("y", int)])
import typing as typ

Point = typ.NamedTuple("Point", [("x", int), ("y", int)])
from typing import *

Point = NamedTuple("Point", [("x", int), ("y", int)])
from typing import *

class Foo(NamedTuple):
    pass
from typing_extensions import *

class Foo(NamedTuple):
    pass
from typing import NamedTuple

NT = NamedTuple

class Foo(NT):
    pass
from typing import NamedTuple as NT

class Foo(NT):
    pass

Other = NT
from typing import NamedTuple

A = B = NamedTuple

class Foo(A):
    pass