no-string-type-annotation

Enforce the use of type identifier instead of using string type hints for simplicity and better syntax highlighting. Starting in Python 3.7, from __future__ import annotations can postpone evaluation of type annotations, and thus forward references no longer need to use string annotation style.

Message

String type hints are no longer necessary in Python, use the type identifier directly.

References

Valid examples

from a.b import Class

def foo() -> Class:
    return Class()
Show more
import typing
from a.b import Class

def foo() -> typing.Type[Class]:
    return Class
import typing
from a.b import Class
from c import func

def foo() -> typing.Optional[typing.Type[Class]]:
    return Class if func() else None
from a.b import Class

def foo(arg: Class) -> None:
    pass

foo(Class())
from a.b import Class

module_var: Class = Class()
from typing import Literal

def foo() -> Literal["a", "b"]:
    return "a"
import typing

def foo() -> typing.Optional[typing.Literal["a", "b"]]:
    return "a"
import typing

def foo() -> typing.Optional[typing.Literal["class", "function"]]:
    return "class"

Invalid examples

from __future__ import annotations

from a.b import Class

def foo() -> "Class":
    return Class()

Suggested fix

from __future__ import annotations

from a.b import Class

def foo() -> Class:
    return Class()
Show more
from __future__ import annotations

from a.b import Class

async def foo() -> "Class":
    return await Class()

Suggested fix

from __future__ import annotations

from a.b import Class

async def foo() -> Class:
    return await Class()
from __future__ import annotations

import typing
from a.b import Class

def foo() -> typing.Type["Class"]:
    return Class

Suggested fix

from __future__ import annotations

import typing
from a.b import Class

def foo() -> typing.Type[Class]:
    return Class
from __future__ import annotations

import typing
from a.b import Class
from c import func

def foo() -> Optional[typing.Type["Class"]]:
    return Class if func() else None

Suggested fix

from __future__ import annotations

import typing
from a.b import Class
from c import func

def foo() -> Optional[typing.Type[Class]]:
    return Class if func() else None
from __future__ import annotations

from a.b import Class

def foo(arg: "Class") -> None:
    pass

foo(Class())

Suggested fix

from __future__ import annotations

from a.b import Class

def foo(arg: Class) -> None:
    pass

foo(Class())
from __future__ import annotations

from a.b import Class

module_var: "Class" = Class()

Suggested fix

from __future__ import annotations

from a.b import Class

module_var: Class = Class()
from __future__ import annotations

import typing
from typing_extensions import Literal
from a.b import Class

def foo() -> typing.Tuple[Literal["a", "b"], "Class"]:
    return Class()

Suggested fix

from __future__ import annotations

import typing
from typing_extensions import Literal
from a.b import Class

def foo() -> typing.Tuple[Literal["a", "b"], Class]:
    return Class()