# 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][silencing-errors] for a more detailed example.
* [Error classes](#error-classes)
* [annotation-type-mismatch](#annotation-type-mismatch)
* [attribute-error](#attribute-error)
* [bad-concrete-type](#bad-concrete-type)
* [bad-function-defaults](#bad-function-defaults)
* [bad-return-type](#bad-return-type)
* [bad-slots](#bad-slots)
* [bad-unpacking](#bad-unpacking)
* [base-class-error](#base-class-error)
* [container-type-mismatch](#container-type-mismatch)
* [duplicate-keyword-argument](#duplicate-keyword-argument)
* [ignored-abstractmethod](#ignored-abstractmethod)
* [ignored-metaclass](#ignored-metaclass)
* [ignored-type-comment](#ignored-type-comment)
* [import-error](#import-error)
* [invalid-annotation](#invalid-annotation)
* [invalid-directive](#invalid-directive)
* [invalid-function-definition](#invalid-function-definition)
* [invalid-function-type-comment](#invalid-function-type-comment)
* [invalid-namedtuple-arg](#invalid-namedtuple-arg)
* [invalid-super-call](#invalid-super-call)
* [invalid-typevar](#invalid-typevar)
* [key-error](#key-error)
* [late-directive](#late-directive)
* [missing-parameter](#missing-parameter)
* [module-attr](#module-attr)
* [mro-error](#mro-error)
* [name-error](#name-error)
* [not-callable](#not-callable)
* [not-indexable](#not-indexable)
* [not-instantiable](#not-instantiable)
* [not-supported-yet](#not-supported-yet)
* [not-writable](#not-writable)
* [pyi-error](#pyi-error)
* [python-compiler-error](#python-compiler-error)
* [recursion-error](#recursion-error)
* [redundant-function-type-comment](#redundant-function-type-comment)
* [reveal-type](#reveal-type)
* [unbound-type-param](#unbound-type-param)
* [unsupported-operands](#unsupported-operands)
* [wrong-arg-count](#wrong-arg-count)
* [wrong-arg-types](#wrong-arg-types)
* [wrong-keyword-args](#wrong-keyword-args)
## annotation-type-mismatch
A variable had a type annotation and an assignment with incompatible types.
Example:
```python
x: int = 'hello world'
```
NOTE: This is currently only checked for fields within a @dataclass definition.
## 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__`:
```python
class A(object):
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:
```python
class A(object):
foo: int
```
NOTE: This declaration does *not* define the attribute at runtime.
The above variable annotation syntax is available only in Python 3.6+, so in
earlier versions, declare a class attribute (with the literal ellipses) and
supply the type in a type comment:
```python
class A(object):
foo = ... # type: int
```
NOTE: This pattern *does* define a runtime attribute.
## bad-concrete-type
A generic type was instantiated with incorrect concrete types.
Example:
```python
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:
```python
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:
```python
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:
```python
# 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.
```python
class Foo(object):
__slots__ = (1, 2, 3)
```
## bad-unpacking
A tuple was unpacked into the wrong number of variables. Example:
```python
a, b = (1, 2, 3) # bad-unpacking
```
## base-class-error
The class definition uses an illegal value for a base class. Example:
```python
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:
```python
a: List[int] = [1, 2]
a.append("hello") #
```python
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][pyi-stub-files] for where the type information we use is located.
## ignored-abstractmethod
The abc.abstractmethod decorator was used in a non-abstract class. Example:
```python
import abc
class A(object): # ignored-abstractmethod
@abc.abstractmethod
def f(self):
pass
```
Add the `abc.ABCMeta` metaclass to fix this issue:
```python
import abc
class A(metaclass=abc.ABCMeta):
@abc.abstractmethod
def f(self):
pass
```
## ignored-metaclass
A Python 2-only metaclass declaration was found. Example:
```python
class A(object):
__metaclass__ = Meta
```
For Python 3-only code, the fix is:
```python
class A(metaclass=Meta):
...
```
For Python 2-and-3 code, two equally good fixes are:
```python
import six
@six.add_metaclass(Meta)
class A(object):
...
```
or:
```python
import six
class A(six.with_metaclass(Meta, object)):
...
```
## ignored-type-comment
A type comment was found on a line on which type comments are not allowed.
Example:
```python
def f():
return 42 # type: float # ignored-type-comment
```
## import-error
The module being imported was not found.
## invalid-annotation
Something is wrong with this annotation. Examples:
```python
from typing import List, TypeVar, Union
T = TypeVar("T")
condition = ... # type: bool
class _Foo: ...
def Foo():
return _Foo()
def f(x: List[int, str]): # bad: too many parameters for List
pass
def f(x: T): # bad: the TypeVar appears only once in the signature
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`:
```python
import attr
import typing
v = typing.cast("A", None) # invalid-annotation
class A(object):
pass
@attr.s
class Foo(object):
v = attr.ib(type=zip) # invalid-annotation
```
The solutions are to use a type comment and to fix the type:
```python
import attr
v = None # type: "A"
class A(object):
pass
@attr.s
class Foo(object):
v = attr.ib(type=list)
```
## invalid-directive
The error name is misspelled in a pytype disable/enable directive. Example with
a misspelled `name-error`:
```python
x = TypeDefinedAtRuntime # pytype: disable=nmae-error # invalid-directive
```
## invalid-function-definition
An invalid function was constructed via metaprogramming (typically with a
decorator such as `@dataclass`). Example:
```python
from dataclasses import dataclass
@dataclass
class A:
x: int = 10
y: str
```
which creates
```python
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:
```python
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:
* must not be a Python keyword,
* must consist of only alphanumeric characters and "_",
* must not start with "_" or a digit.
Also, there can be no duplicate field names. The typename has the same
requirements, except that it can start with "_".
## invalid-super-call
A call to super without any arguments (Python 3) is being made from an invalid
context. A super call without any arguments should be made from a method or a
function defined within a class. Also, the caller should have at least one
positional argument.
## invalid-typevar
Something was wrong with this TypeVar definition. Examples:
```python
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
```
## key-error
The dictionary key doesn't exist. Example:
```python
x = {}
y = x["y"] # key-error
```
## 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:
```python
def f() -> bool:
# pytype: disable=bad-return-type # late-directive
return 42
```
Two equally acceptable fixes:
```python
def f() -> bool:
return 42 # pytype: disable=bad-return-type
```
```python
# pytype: disable=bad-return-type
def f() -> bool:
return 42
# pytype: enable=bad-return-type
```
## missing-parameter
The function was called with a parameter missing. Example:
```python
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][pyi-stub-files] for where the type information we use is located.
## module-attr
The module attribute being accessed may not exist. Example:
```python
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:
```python
class A(object):
pass
class B(object, A): # mro-error
pass
```
## name-error
This name does not exist in the current namespace. Note that types like `List`,
`Dict`, etc., need to be imported from the typing module:
```python
MyListType = List[str] # name-error
```
```python
from typing import List
MyListType = List[str]
```
## not-callable
The object being called or instantiated is not callable. Example:
```python
x = 42
y = x() # not-callable
```
## not-indexable
The object being indexed is not indexable. Example:
```python
tuple[3] # not-indexable
```
## not-instantiable
The class cannot be instantiated because it has abstract methods. Example:
```python
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.
## not-writable
The object an attribute was set on doesn't have that attribute, or that
attribute isn't writable:
```python
class Foo(object):
__slots__ = ("x", "y")
Foo().z = 42 # not-writable
```
## 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][new-bug].
## python-compiler-error
The Python code contains a syntax error.
## recursion-error
A recursive definition was found in a pyi file. Example:
```python
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][new-bug].
## redundant-function-type-comment
Using both inline annotations and a type comment to annotate the same function
is not allowed. Example:
```python
def f() -> None:
# type: () -> None # redundant-function-type-comment
pass
```
## reveal-type
The error message displays the type of the expression passed to it. Example:
```python
import os
reveal_type(os.path.join("hello", u"world")) # reveal-type: unicode
```
This feature is implemented as an error to ensure that `reveal_type()` calls are
removed after debugging.
## unbound-type-param
This error currently applies only to pyi files. The type parameter is not bound
to a class or function. Example:
```python
from typing import AnyStr
x = ... # type: AnyStr # unbound-type-param
```
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:
```python
from typing import Union
x = ... # type: Union[str, unicode]
```
## unsupported-operands
A binary operator was called with incompatible arguments. Example:
```python
x = "hello" ^ "world" # unsupported-operands
```
## wrong-arg-count
The function was called with the wrong number of arguments. Example:
```python
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][pyi-stub-files] for where the type information we use is located.
## wrong-arg-types
The function was called with the wrong argument types. Example:
```python
def f(x: int):
pass
f(42.0) # wrong-arg-types
```
If you believe you are seeing this error due to a bug on pytype's end, see
[this section][pyi-stub-files] for where the type information we use is located.
## wrong-keyword-args
The function was called with the wrong keyword arguments. Example:
```python
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][pyi-stub-files] for where the type information we use is located.
[pyi-stub-files]: user_guide.md#pytypes-pyi-stub-files
[silencing-errors]: user_guide.md#silencing-errors
[new-bug]: https://github.com/google/pytype/issues/new