pytype

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

Error classes

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.

annotation-type-mismatch

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' 

assert-type

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] 

attribute-error

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.

bad-concrete-type

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 

bad-function-defaults

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 

bad-return-type

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 

bad-slots

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) 

bad-unpacking

A tuple was unpacked into the wrong number of variables. Example:

a, b = (1, 2, 3) # bad-unpacking 

bad-yield-annotation

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 

base-class-error

The class definition uses an illegal value for a base class. Example:

class A(42): # base-class-error  pass 

container-type-mismatch

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` 

dataclass-error

An error was raised while constructing a dataclass.

duplicate-keyword-argument

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.

final-error

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 

ignored-abstractmethod

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 

ignored-metaclass

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): ... 

ignored-type-comment

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 

import-error

The module being imported was not found.

incomplete-match

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 

invalid-annotation

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) 

invalid-directive

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 

invalid-function-definition

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.

invalid-function-type-comment

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 

invalid-namedtuple-arg

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 “_”.

invalid-signature-mutation

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]): ... 

invalid-super-call

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

invalid-typevar

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 

late-directive

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 

match-error

An invalid pattern matching construct was used (e.g. too many positional parameters)

missing-parameter

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.

module-attr

The module attribute being accessed may not exist. Example:

import sys sys.nonexistent_attribute # module-attr 

mro-error

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 

name-error

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 

not-callable

The object being called or instantiated is not callable. Example:

x = 42 y = x() # not-callable 

not-indexable

The object being indexed is not indexable. Example:

tuple[3] # not-indexable 

not-instantiable

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 

not-supported-yet

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

not-writable

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 

override-error

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 

paramspec-error

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.

pyi-error

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.

python-compiler-error

The Python code contains a syntax error.

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

redundant-function-type-comment

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 

redundant-match

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 

reveal-type

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.

signature-mismatch

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.

typed-dict-error

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 

unbound-type-param

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

unsupported-operands

A binary operator was called with incompatible arguments. Example:

x = "hello" ^ "world" # unsupported-operands 

wrong-arg-count

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.

wrong-arg-types

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.

wrong-keyword-args

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.