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