A static type analyzer for Python code
Home
User guide
Developer guide
Error classes
FAQ
Typing FAQ
Supported features
Mailing list
File a bug
View the Project on GitHub google/pytype
Hosted on GitHub Pages — Theme by orderedlist
pytype has the following classes of errors, which can be disabled with a
pytype: disable=error-class
directive. For example, to suppress an
error for a missing attribute foo
:
x = a.foo # pytype: disable=attribute-error
or, to suppress all attribute errors for a block of code:
# pytype: disable=attribute-error
x = a.foo
y = a.bar
# pytype: enable=attribute-error
See Silencing Errors for a more detailed example.
A variable had a type annotation and an assignment with incompatible types.
Example:
x: int = 'hello world'
This error is also raised for wrongly assigning a value in a TypedDict
:
from typing import TypedDict
class A(TypedDict):
x: int
y: str
a = A()
a['x'] = '10'
The error message displays the expected and actual type of the expression passed
to assert_type()
if the two do not match. Example:
x = 10
assert_type(x, str)
will raise the error
File "foo.py", line 2, in <module>:
Type[int] [assert-type]
Expected: str
Actual: int
The expected type can be either a python type (like str
or foo.A
) or its
string representation. The latter form is useful when you want to assert a type
without importing it, e.g.
from collections.abc import Sequence
assert_type(x, Sequence[int])
versus
assert_type(x, 'Sequence[int]')
assert_type
can also be used without an expected
argument to assert that a
type is not Any
; in that case the error message is
File "foo.py", line 10, in f: Asserted type was Any [assert-type]
The attribute being accessed may not exist. Often, the reason is that the
attribute is declared in a method other than __new__
or __init__
:
class A:
def make_foo(self):
self.foo = 42
def consume_foo(self):
return self.foo # attribute-error
To make pytype aware of foo
, declare its type with a variable annotation:
class A:
foo: int
NOTE: This declaration does not define the attribute at runtime.
A generic type was instantiated with incorrect concrete types. Example:
from typing import Generic, TypeVar
T = TypeVar('T', int, float)
class A(Generic[T]):
pass
obj = A[str]() # bad-concrete-type
An attempt was made to set the __defaults__
attribute of a function with an
object that is not a constant tuple. Example:
import collections
X = collections.namedtuple("X", "a")
X.__new__.__defaults__ = [None] # bad-function-defaults
At least one of the possible types for the return value does not match the declared return type. Example:
def f(x) -> int:
if x:
return 42
else:
return None # bad-return-type
NOTE: For the corner case of an empty function whose body is a docstring, use
the block form of disable
to suppress the error:
# pytype: disable=bad-return-type
def f() -> int:
"""Override in subclasses and return int."""
# pytype: enable=bad-return-type
An attempt was made to set the __slots__
attribute of a class using an object
that’s not a string.
class Foo:
__slots__ = (1, 2, 3)
A tuple was unpacked into the wrong number of variables. Example:
a, b = (1, 2, 3) # bad-unpacking
A generator function (a function with a yield
) was not annotated with an
appropriate return type.
def gen() -> int: # bad-yield-annotation
yield 1
def gen() -> Iterator[int]
# Could also use Generator or Iterable.
yield 1
The class definition uses an illegal value for a base class. Example:
class A(42): # base-class-error
pass
A method call violated the type annotation of a container by modifying its contained type.
Example:
a: list[int] = [1, 2]
a.append("hello") # <-- contained type is now `int | str`
An error was raised while constructing a dataclass.
A positional argument was supplied again as a keyword argument. Example:
def f(x):
pass
f(True, x=False) # duplicate-keyword-argument
If you believe you are seeing this error due to a bug on pytype’s end, see this section for where the type information we use is located.
An attempt was made to subclass, override or reassign a final object or variable. The exact meaning of “final” is context dependent; see PEP 591 for the full details. Example:
class A:
FOO: Final[int] = 10
class B(A):
FOO = 20 # final-error
The abc.abstractmethod decorator was used in a non-abstract class. Example:
import abc
class A: # ignored-abstractmethod
@abc.abstractmethod
def f(self):
pass
Add the abc.ABCMeta
metaclass to fix this issue:
import abc
class A(metaclass=abc.ABCMeta):
@abc.abstractmethod
def f(self):
pass
A Python 2 metaclass declaration was found. Example:
class A:
__metaclass__ = Meta
The fix is to switch to a Python 3-style metaclass:
class A(metaclass=Meta):
...
A type comment was found on a line on which type comments are not allowed. Example:
def f():
return 42 # type: float # ignored-type-comment
The module being imported was not found.
A pattern match over an enum did not cover all possible cases.
from enum import Enum
class Color(Enum):
RED = 0
GREEN = 1
BLUE = 2
def f(x: Color):
match x: # incomplete-match
case Color.RED:
return 10
case Color.GREEN:
return 20
Something is wrong with this annotation. A common issue is a TypeVar that appears only once in a function signature:
from typing import TypeVar
T = TypeVar("T")
def f(x: T): # bad: the TypeVar appears only once in the signature
pass
A TypeVar is meaningful only when it appears multiple times in the same class/function, since it’s used to indicate that two or more values have the same type.
Other examples:
from typing import Union
condition: bool = ...
class _Foo: ...
def Foo():
return _Foo()
def f(x: list[int, str]): # bad: too many parameters for List
pass
def f(x: Foo): # bad: not a type
pass
def f(x: Union): # bad: no options in the union
pass
def f(x: int if condition else str): # bad: ambiguous type
pass
You will also see this error if you use a forward reference in typing.cast or
pass a bad type to attr.ib
:
import attr
import typing
v = typing.cast("A", None) # invalid-annotation
class A:
pass
@attr.s
class Foo:
v = attr.ib(type=zip) # invalid-annotation
The solutions are to use a variable annotation and to fix the type:
import attr
v: "A" = None
class A:
pass
@attr.s
class Foo:
v = attr.ib(type=list)
The error name is misspelled in a pytype disable/enable directive. Example with
a misspelled name-error
:
x = TypeDefinedAtRuntime # pytype: disable=nmae-error # invalid-directive
An invalid function was constructed, typically with a decorator such as
@dataclass
. Example:
from dataclasses import dataclass
@dataclass
class A:
x: int = 10
y: str
which creates
def __init__(x: int = 10, y: str):
...
with a non-default argument following a default one.
Something was wrong with this function type comment. Examples:
def f(x):
# type: (int) # bad: missing return type
pass
def f(x):
# type: () -> None # bad: too few arguments
pass
def f(x):
# type: int -> None # bad: missing parentheses
pass
The typename or one of the field names in the namedtuple definition is invalid. Field names:
Also, there can be no duplicate field names. The typename has the same requirements, except that it can start with “_”.
A method signature in a pyi file has an annotation on self
that does not match
the base class.
Generic class methods can annotate self
with more specific type parameters,
which will then specialize the type of the receiver when the method is called,
but the self
annotation cannot mutate the base class.
class A(Generic[T]):
def foo(self: B[int]): ...
A call to super without any arguments (Python 3) is being made from an invalid context:
super().foo()
class A(B):
def f():
super().foo()
A super call without any arguments should be made from a method or a function defined within a class, and the caller should have at least one positional argument:
class A(B):
def f(self):
super().foo()
Something was wrong with this TypeVar definition. Examples:
from typing import TypeVar
T = TypeVar("S") # bad: storing TypeVar "S" as "T"
T = TypeVar(42) # bad: using a non-str value for the TypeVar name
T = TypeVar("T", str) # bad: supplying a single constraint (did you mean `bound=str`?)
T = TypeVar("T", 0, 100) # bad: 0 and 100 are not types
A # pytype: disable
without a matching following enable or a # type: ignore
appeared on its own line after the first top-level definition. Such a directive
takes effect for the rest of the file, regardless of indentation, which is
probably not what you want:
def f() -> bool:
# pytype: disable=bad-return-type # late-directive
return 42
Two equally acceptable fixes:
def f() -> bool:
return 42 # pytype: disable=bad-return-type
# pytype: disable=bad-return-type
def f() -> bool:
return 42
# pytype: enable=bad-return-type
An invalid pattern matching construct was used (e.g. too many positional parameters)
The function was called with a parameter missing. Example:
def add(x, y):
return x + y
add(42) # missing-parameter
If you believe you are seeing this error due to a bug on pytype’s end, see this section for where the type information we use is located.
The module attribute being accessed may not exist. Example:
import sys
sys.nonexistent_attribute # module-attr
A valid method resolution order cannot be created for the class being defined. Often, the culprit is cyclic inheritance:
class A:
pass
class B(object, A): # mro-error
pass
This name does not exist in the current namespace. Note that abstract types like
Sequence
, Callable
, etc., need to be imported from the collections.abc
module:
MySequenceType = Sequence[str] # name-error
from collections.abc import Sequence
MySequenceType = Sequence[str]
Note that a name from an outer namespace cannot be referenced if you redefine it
in the current namespace, unless you use the global
or nonlocal
keyword:
def f():
x = 0
def g():
x += 1 # name-error
def f():
x = 0
def g():
nonlocal x
x += 1
The object being called or instantiated is not callable. Example:
x = 42
y = x() # not-callable
The object being indexed is not indexable. Example:
tuple[3] # not-indexable
The class cannot be instantiated because it has abstract methods. Example:
import abc
class A(metaclass=abc.ABCMeta):
@abc.abstractmethod
def f(self):
pass
A() # not-instantiable
This feature is not yet supported by pytype.
The fix for the error “Calling TypeGuard function ‘foo’ with an arbitrary
expression not supported yet” is to refactor the code passing an arbitrary
expression to foo
to pass in a local variable instead. For example:
# Before:
if foo(eggs[0]):
do_something()
# After:
egg = eggs[0]
if foo(egg):
do_something()
The object an attribute was set on doesn’t have that attribute, or that attribute isn’t writable:
class Foo:
__slots__ = ("x", "y")
Foo().z = 42 # not-writable
This error is reported when @typing.override
is used to decorate a
non-overriding method:
import typing
class Parent:
def new_foo(self):
pass
class Child(Parent):
@typing.override
def foo(self): # override-error
pass
If you enable the require-override-decorator
feature, then you’ll also get
this error when the decorator is forgotten:
# pytype: features=require-override-decorator
class Parent:
def foo(self):
pass
class Child(Parent):
def foo(self): # override-error
pass
A parameter specification variable was used incorrectly. Examples
include only having a single ParamSpec in a function signature, and not exactly
following the limited syntax for P.args
and P.kwargs
.
The pyi file contains a syntax error.
If you encounter this error in a pyi file that you did not create yourself, please file a bug.
The Python code contains a syntax error.
A recursive definition was found in a pyi file. Example:
class A(B): ...
class B(A): ...
If you encounter this error in a pyi file that you did not create yourself, please file a bug.
Using both inline annotations and a type comment to annotate the same function is not allowed. Example:
def f() -> None:
# type: () -> None # redundant-function-type-comment
pass
A pattern match over an enum covered the same case more than once.
from enum import Enum
class Color(Enum):
RED = 0
GREEN = 1
BLUE = 2
def f(x: Color):
match x:
case Color.RED:
return 10
case Color.GREEN:
return 20
case Color.RED | Color.BLUE: # redundant-match
return 20
The error message displays the type of the expression passed to it. Example:
import os
reveal_type(os.path.join("hello", u"world")) # reveal-type: str
This feature is implemented as an error to ensure that reveal_type()
calls are
removed after debugging.
The overriding method signature doesn’t match the overridden method:
class A:
def f(self, x: int) -> None:
pass
class B(A):
def f(self, x:int, y: int) -> None: # signature-mismatch
pass
class A:
def f(self, x: int) -> None:
pass
class B(A):
def f(self, x:int, y: int = 0) -> None:
pass
See FAQ on why it can cause problems.
A TypedDict has been accessed with an invalid key. Example:
from typing import TypedDict
class A(TypedDict):
x: int
y: str
a = A()
a['z'] = 10
This error currently applies only to pyi files. The type parameter is not bound to a class or function. Example:
from typing import AnyStr
x: AnyStr = ...
Unbound type parameters are meaningless as types. If you want to take advantage of types specified by a type parameter’s constraints or bound, specify those directly. So the above example should be rewritten as:
x: str | bytes = ...
A binary operator was called with incompatible arguments. Example:
x = "hello" ^ "world" # unsupported-operands
The function was called with the wrong number of arguments. Example:
def add(x, y):
return x + y
add(1, 2, 3) # wrong-arg-count
If you believe you are seeing this error due to a bug on pytype’s end, see this section for where the type information we use is located.
The function was called with the wrong argument types. Example:
def f(x: int):
pass
f(42.0) # wrong-arg-types
If you are seeing a Non-Iterable String Error, please see FAQ.
If you believe you are seeing this error due to a bug on pytype’s end, see this section for where the type information we use is located.
The function was called with the wrong keyword arguments. Example:
def f(x=True):
pass
f(y=False) # wrong-keyword-args
If you believe you are seeing this error due to a bug on pytype’s end, see this section for where the type information we use is located.