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

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 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