Version history
This library adheres to Semantic Versioning 2.0.
4.4.4 (2026-06-18)
Fixed
IndexErrorwhen using@typecheckedon more than one function with the same name under certain circumstances (#527)Fixed
TypeErrorduring type checking when the value to check is a parametrized generic class (#526)
4.4.3 (2025-06-05)
Fixed
@typecheckedunable to find the target function or method if it or the containing class had PEP 695 type parameters on them (#500)Fixed handling of union types on Python 3.14 (#522)
Fixed
__type_params__getting lost when a function is instrumented
4.4.2 (2025-02-16)
Fixed
TypeCheckErrorin unpacking assignment involving properties of a parameter of the function (#506; regression introduced in v4.4.1)Fixed display of module name for forward references (#492; PR by @JelleZijlstra)
Fixed
TypeErrorwhen using an assignment expression (#510; PR by @JohannesK71083)Fixed
ValueError: no signature found for builtinwhen checking against a protocol and a matching attribute in the subject is a built-in function (#504)
4.4.1 (2024-11-03)
Dropped Python 3.8 support
Changed the signature of
typeguard_ignore()to be compatible withtyping.no_type_check()(PR by @jolaf)Avoid creating reference cycles when type checking uniontypes and classes
Fixed checking of variable assignments involving tuple unpacking (#486)
Fixed
TypeErrorwhen checking a class againsttype[Self](#481)Fixed checking of protocols on the class level (against
type[SomeProtocol]) (#498)Fixed
Selfchecks in instance/class methods that have positional-only argumentsFixed explicit checks of PEP 604 unions against
types.UnionType(#467)Fixed checks against annotations wrapped in
NotRequirednot being run unless theNotRequiredis a forward reference (#454)
4.4.0 (2024-10-27)
Added proper checking for method signatures in protocol checks (#465)
Fixed basic support for intersection protocols (#490; PR by @antonagestam)
4.3.0 (2024-05-27)
Added support for checking against static protocols
Fixed some compatibility problems when running on Python 3.13 (#460; PR by @JelleZijlstra)
Fixed test suite incompatibility with pytest 8.2 (#461)
Fixed pytest plugin crashing on pytest version older than v7.0.0 (even if it’s just present) (#343)
4.2.1 (2023-03-24)
Fixed missing
typing_extensionsdependency for Python 3.12 (#444)Fixed deprecation warning in the test suite on Python 3.13 (#444)
4.2.0 (2023-03-23)
Added support for specifying options for the pytest plugin via pytest config files (#440)
Avoid creating reference cycles when type checking unions (PR by Shantanu)
Fixed
Optional[...]being removed from the AST if it was located within a subscript (#442)Fixed
TypedDictfromtyping_extensionsnot being recognized as one (#443)Fixed
typingtypes (dict[str, int],List[str], etc.) not passing checks againsttypeorType(#432, PR by Yongxin Wang)Fixed detection of optional fields (
NotRequired[...]) inTypedDictwhen using forward references (#424)Fixed mapping checks against Django’s
MultiValueDict(#419)
4.1.5 (2023-09-11)
Fixed
Callableerroneously rejecting a callable that has the requested amount of positional arguments but they have defaults (#400)Fixed a regression introduced in v4.1.4 where the elements of
Literalgot quotes removed from them by the AST transformer (#399)
4.1.4 (2023-09-10)
Fixed
AttributeErrorwhere the transformer removed elements from a PEP 604 union (#384)Fixed
AttributeError: 'Subscript' object has no attribute 'slice'when encountering an annotation with a subscript containing an ignored type (imported within anif TYPE_CHECKING:block) (#397)Fixed type checking not being skipped when the target is a union (PEP 604 or
typing.Union) where one of the elements is an ignored type (shadowed by an argument, variable assignment or anif TYPE_CHECKINGimport) (#394, #395)Fixed type checking of class instances created in
__new__()in cases such as enums where this method is already invoked before the class has finished initializing (#398)
4.1.3 (2023-08-27)
Dropped Python 3.7 support
Fixed
@typecheckedoptimization causing compilation of instrumented code to fail when any block was left empty by the AST transformer (egifortry/exceptblocks) (#352)Fixed placement of injected typeguard imports with respect to
__future__imports and module docstrings (#385)
4.1.2 (2023-08-18)
Fixed
Anybeing removed from a subscript that still contains other elements (#373)
4.1.1 (2023-08-16)
Fixed
suppress_type_checks()causing annotated variable assignments to always assignNone(#380)
4.1.0 (2023-07-30)
Added support for passing a tuple as
expected_typetocheck_type(), making it more of a drop-in replacement forisinstance()(#371)Fixed regression where
Literalinside aUnionhad quotes stripped from its contents, thus typically causingNameErrorto be raised when run (#372)
4.0.1 (2023-07-27)
Fixed handling of
typing_extensions.Literalon Python 3.8 and 3.9 whentyping_extensions>=4.6.0is installed (#363; PR by Alex Waygood)Fixed
NameErrorwhen generated type checking code references an imported name from a method (#362)Fixed docstrings disappearing from instrumented functions (#359)
Fixed
@typecheckedfailing to instrument functions when there are more than one function within the same scope (#355)Fixed
frozensetnot being checked (#367)
4.0.0 (2023-05-12)
No changes
4.0.0rc6 (2023-05-07)
Fixed
@typecheckedoptimization causing compilation of instrumented code to fail when anifblock was left empty by the AST transformer (#352)Fixed the AST transformer trying to parse the second argument of
typing.Annotatedas a forward reference (#353)
4.0.0rc5 (2023-05-01)
Added
InstrumentationWarningto the public APIChanged
@typecheckedto skip instrumentation in optimized mode, as in typeguard 2.xAvoid type checks where the types in question are shadowed by local variables
Fixed instrumentation using
typing.Optionalwithout a subscript when the subscript value was erased due to being an ignored importFixed
TypeError: isinstance() arg 2 must be a type or tuple of typeswhen instrumented code tries to check a value against a naked (str, notForwardRef) forward referenceFixed instrumentation using the wrong “self” type in the
__new__()method
4.0.0rc4 (2023-04-15)
Fixed imports guarded by
if TYPE_CHECKING:when used with subscripts (SomeType[...]) being replaced withAny[...]instead of justAnyFixed instrumentation inadvertently mutating a function’s annotations on Python 3.7 and 3.8
Fixed
Concatenate[...]inCallableparameters causingTypeErrorto be raisedFixed type checks for
*argsor**kwargsnot being suppressed when their types are unusable (guarded byif TYPE_CHECKING:or otherwise)Fixed
TypeErrorwhen checking against a genericNewTypeDon’t try to check types shadowed by argument names (e.g.
def foo(x: type, type: str): ...)Don’t check against unions where one of the elements is
Any
4.0.0rc3 (2023-04-10)
Fixed
typing.Literalsubscript contents being evaluated as forward referencesFixed resolution of forward references in type aliases
4.0.0rc2 (2023-04-08)
The
.pycfiles now use a version-based optimization suffix in the file names so as not to cause the interpreter to load potentially faulty/incompatible cached bytecode generated by older versionsFixed typed variable positional and keyword arguments causing compilation errors on Python 3.7 and 3.8
Fixed compilation error when a type annotation contains a type guarded by
if TYPE_CHECKING:
4.0.0rc1 (2023-04-02)
BACKWARD INCOMPATIBLE
check_type()no longer uses the global configuration. It now uses the default configuration values, unless overridden with an explicitconfigargument.BACKWARD INCOMPATIBLE Removed
CallMemofrom the APIBACKWARD INCOMPATIBLE Required checkers to use the configuration from
memo.config, rather than the global configurationAdded keyword arguments to
@typechecked, allowing users to override settings on a per-function basisAdded support for using
suppress_type_checks()as a decoratorAdded support for type checking against nonlocal classes defined within the same parent function as the instrumented function
Changed instrumentation to statically copy the function annotations to avoid having to look up the function object at run time
Improved support for avoiding type checks against imports declared in
if TYPE_CHECKING:blocksFixed
check_typenot returning the passed value when checking againstAny, or when type checking is being suppressedFixed
suppress_type_checks()not ending the suppression if the context block raises an exceptionFixed checking non-dictionary objects against a
TypedDictannotation (PR by Tolker-KU)
3.0.2 (2023-03-22)
Improved warnings by ensuring that they target user code and not Typeguard internal code
Fixed
warn_on_error()not showing where the type violation actually occurredFixed local assignment to
*argsor**kwargsbeing type checked incorrectlyFixed
TypeErroroncheck_type(..., None)Fixed unpacking assignment not working with a starred variable (
x, *y = ...) in the target tupleFixed variable multi-assignment (
a = b = c = ...) being type checked incorrectly
3.0.1 (2023-03-16)
Improved the documentation
Fixed assignment unpacking (
a, b = ...) being checked incorrectlyFixed
@typecheckedattempting to instrument wrapper decorators such as@contextmanagerwhen applied to a classFixed
py.typedmissing from the wheel when not building from a git checkout
3.0.0 (2023-03-15)
BACKWARD INCOMPATIBLE Dropped the
argname,memo,globalsandlocalsarguments fromcheck_type()BACKWARD INCOMPATIBLE Removed the
check_argument_types()andcheck_return_type()functions (use@typecheckedinstead)BACKWARD INCOMPATIBLE Moved
install_import_hookto be directly importable from thetypeguardmoduleBACKWARD INCOMPATIBLE Changed the checking of collections (list, set, dict, sequence, mapping) to only check the first item by default. To get the old behavior, set
typeguard.config.collection_check_strategytoCollectionCheckStrategy.ALL_ITEMSBACKWARD INCOMPATIBLE Type checking failures now raise
typeguard.TypeCheckErrorinstead ofTypeErrorDropped Python 3.5 and 3.6 support
Dropped the deprecated profiler hook (
TypeChecker)Added a configuration system
Added support for custom type checking functions
Added support for PEP 604 union types (
X | Y) on all Python versionsAdded support for generic built-in collection types (
list[int]et al) on all Python versionsAdded support for checking arbitrary
MappingtypesAdded support for the
SelftypeAdded support for
typing.Never(andtyping_extensions.Never)Added support for
NeverandNoReturnin argument annotationsAdded support for
LiteralStringAdded support for
TypeGuardAdded support for the subclassable
Anyon Python 3.11 andtyping_extensionsAdded the possibility to have the import hook instrument all packages
Added the
suppress_type_checks()context manager function for temporarily disabling type checksMuch improved error messages showing where the type check failed
Made it possible to apply
@typecheckedon top of@classmethod/@staticmethod(PR by jacobpbrugh)Changed
check_type()to return the passed value, so it can be used (to an extent) in place oftyping.cast(), but with run-time type checkingReplaced custom implementation of
is_typeddict()with the implementation fromtyping_extensionsv4.1.0Emit
InstrumentationWarninginstead of raisingRuntimeErrorfrom the pytest plugin if modules in the target package have already been importedFixed
TypeErrorwhen checking againstTypedDictwhen the value has mixed types among the extra keys (PR by biolds)Fixed incompatibility with
typing_extensionsv4.1+ on Python 3.10 (PR by David C.)Fixed checking of
Tuple[()]on Python 3.11 andtuple[()]on Python 3.9+Fixed integers 0 and 1 passing for
Literal[False]andLiteral[True], respectivelyFixed type checking of annotated variable positional and keyword arguments (
*argsand**kwargs)Fixed checks against
unittest.Mockand derivatives being done in the wrong place
2.13.3 (2021-12-10)
Fixed
TypeErrorwhen using typeguard withinexec()(where__module__isNone) (PR by Andy Jones)Fixed
TypedDictcausingTypeError: TypedDict does not support instance and class checkson Python 3.8 with standard library (nottyping_extensions) typed dicts
2.13.2 (2021-11-23)
Fixed
typing_extensionsbeing imported unconditionally on Python < 3.9 (bug introduced in 2.13.1)
2.13.1 (2021-11-23)
Fixed
@typecheckedreplacing abstract properties with regular propertiesFixed any generic type subclassing
Dictbeing mistakenly checked asTypedDicton Python 3.10
2.13.0 (2021-10-11)
Added support for returning
NotImplementedfrom binary magic methods (__eq__()et al)Added support for checking union types (e.g.
Type[Union[X, Y]])Fixed error message when a check against a
Literalfails in a union on Python 3.10Fixed
NewTypenot being checked on Python 3.10Fixed unwarranted warning when
@typecheckedis applied to a class that contains unannotated propertiesFixed
TypeErrorin the async generator wrapper due to changes in__aiter__()protocolFixed broken
TypeVarchecks – variance is now (correctly) disregarded, and only bound types and constraints are checked against (but type variable resolution is not done)
2.12.1 (2021-06-04)
Fixed
AttributeErrorwhen__code__is missing from the checked callable (PR by epenet)
2.12.0 (2021-04-01)
Added
@typeguard_ignoredecorator to exclude specific functions and classes from runtime type checking (PR by Claudio Jolowicz)
2.11.1 (2021-02-16)
Fixed compatibility with Python 3.10
2.11.0 (2021-02-13)
Added support for type checking class properties (PR by Ethan Pronovost)
Fixed static type checking of
@typecheckeddecorators (PR by Kenny Stauffer)Fixed wrong error message when type check against a
bytesdeclaration failsAllowed
memoryviewobjects to pass asbytes(like MyPy does)Shortened tracebacks (PR by prescod)
2.10.0 (2020-10-17)
Added support for Python 3.9 (PR by Csergő Bálint)
Added support for nested
LiteralAdded support for
TypedDictinheritance (with some caveats; see the user guide on that for details)An appropriate
TypeErroris now raised when encountering an illegalLiteralvalueFixed checking
NoReturnon Python < 3.8 whentyping_extensionswas not installedFixed import hook matching unwanted modules (PR by Wouter Bolsterlee)
Install the pytest plugin earlier in the test run to support more use cases (PR by Wouter Bolsterlee)
2.9.1 (2020-06-07)
Fixed
ImportErroron Python < 3.8 whentyping_extensionswas not installed
2.9.0 (2020-06-06)
Upped the minimum Python version from 3.5.2 to 3.5.3
Added support for
typing.NoReturnAdded full support for
typing_extensions(now equivalent to support of thetypingmodule)Added the option of supplying
check_type()with globals/locals for correct resolution of forward referencesFixed erroneous
TypeErrorwhen trying to check against non-runtimetyping.Protocol(skips the check for now until a proper compatibility check has been implemented)Fixed forward references in
TypedDictnot being resolvedFixed checking against recursive types
2.8.0 (2020-06-02)
Added support for the
MockandMagicMocktypes (PR by prescod)Added support for
typing_extensions.Literal(PR by Ryan Rowe)Fixed unintended wrapping of untyped generators (PR by prescod)
Fixed checking against bound type variables with
check_type()without a call memoFixed error message when checking against a
Unioncontaining aLiteral
2.7.1 (2019-12-27)
Fixed
@typecheckedreturningNonewhen called withalways=Trueand Python runs in optimized modeFixed performance regression introduced in v2.7.0 (the
getattr_static()call was causing a 3x slowdown)
2.7.0 (2019-12-10)
Added support for
typing.ProtocolsubclassesAdded support for
typing.AbstractSetFixed the handling of
total=FalseinTypedDictFixed no error reported on unknown keys with
TypedDictRemoved support of default values in
TypedDict, as they are not supported in the spec
2.6.1 (2019-11-17)
Fixed import errors when using the import hook and trying to import a module that has both a module docstring and
__future__imports in itFixed
AttributeErrorwhen using@typecheckedon a metaclassFixed
@typecheckedcompatibility with built-in function wrappersFixed type checking generator wrappers not being recognized as generators
Fixed resolution of forward references in certain cases (inner classes, function-local classes)
Fixed
AttributeErrorwhen a class has contains a variable that is an instance of a class that has a__call__()methodFixed class methods and static methods being wrapped incorrectly when
@typecheckedis applied to the classFixed
AttributeErrorwhen@typecheckedis applied to a function that has been decorated with a decorator that does not properly wrap the original (PR by Joel Beach)Fixed collections with mixed value (or key) types raising
TypeErroron Python 3.7+ when matched against unparametrized annotations from thetypingmoduleFixed inadvertent
TypeErrorwhen checking against a type variable that has constraints or a bound type expressed as a forward reference
2.6.0 (2019-11-06)
Added a PEP 302 import hook for annotating functions and classes with
@typecheckedAdded a pytest plugin that activates the import hook
Added support for
typing.TypedDictDeprecated
TypeChecker(will be removed in v3.0)
2.5.1 (2019-09-26)
Fixed incompatibility between annotated
Iterable,Iterator,AsyncIterableorAsyncIteratorreturn types and generator/async generator functionsFixed
TypeErrorbeing wrapped inside another TypeError (PR by russok)
2.5.0 (2019-08-26)
Added yield type checking via
TypeCheckerfor regular generatorsAdded yield, send and return type checking via
@typecheckedfor regular and async generatorsSilenced
TypeCheckerwarnings about async generatorsFixed bogus
TypeErroronType[Any]Fixed bogus
TypeCheckerwarnings when an exception is raised from a type checked functionAccept a
bytearraywherebytesare expected, as per python/typing#552Added policies for dealing with unmatched forward references
Added support for using
@typecheckedas a class decoratorAdded
check_return_type()to accompanycheck_argument_types()Added Sphinx documentation
2.4.1 (2019-07-15)
Fixed broken packaging configuration
2.4.0 (2019-07-14)
Added PEP 561 support
Added support for empty tuples (
Tuple[()])Added support for
typing.LiteralMake getting the caller frame faster (PR by Nick Sweeting)
2.3.1 (2019-04-12)
Fixed thread safety issue with the type hints cache (PR by Kelsey Francis)
2.3.0 (2019-03-27)
Added support for
typing.IOand derivativesFixed return type checking for coroutine functions
Dropped support for Python 3.4
2.2.2 (2018-08-13)
Fixed false positive when checking a callable against the plain
typing.Callableon Python 3.7
2.2.1 (2018-08-12)
Argument type annotations are no longer unioned with the types of their default values, except in the case of
Noneas the default value (although PEP 484 still recommends against this)Fixed some generic types (
typing.Collectionamong others) producing false negatives on Python 3.7Shortened unnecessarily long tracebacks by raising a new
TypeErrorbased on the old oneAllowed type checking against arbitrary types by removing the requirement to supply a call memo to
check_type()Fixed
AttributeErrorwhen running with the pydev debugger extension installedFixed getting type names on
typing.*on Python 3.7 (fix by Dale Jung)
2.2.0 (2018-07-08)
Fixed compatibility with Python 3.7
Removed support for Python 3.3
Added support for
typing.NewType(contributed by reinhrst)
2.1.4 (2018-01-07)
Removed support for backports.typing, as it has been removed from PyPI
Fixed checking of the numeric tower (complex -> float -> int) according to PEP 484
2.1.3 (2017-03-13)
Fixed type checks against generic classes
2.1.2 (2017-03-12)
Fixed leak of function objects (should’ve used a
WeakValueDictionaryinstead ofWeakKeyDictionary)Fixed obscure failure of TypeChecker when it’s unable to find the function object
Fixed parametrized
Typenot working with type variablesFixed type checks against variable positional and keyword arguments
2.1.1 (2016-12-20)
Fixed formatting of README.rst so it renders properly on PyPI
2.1.0 (2016-12-17)
Added support for
typings.Type(available in Python 3.5.2+)Added a third,
sys.setprofile()based type checking approach (typeguard.TypeChecker)Changed certain type error messages to display “function” instead of the function’s qualified name
2.0.2 (2016-12-17)
More Python 3.6 compatibility fixes (along with a broader test suite)
2.0.1 (2016-12-10)
Fixed additional Python 3.6 compatibility issues
2.0.0 (2016-12-10)
BACKWARD INCOMPATIBLE Dropped Python 3.2 support
Fixed incompatibility with Python 3.6
Use
inspect.signature()in place ofinspect.getfullargspecAdded support for
typing.NamedTuple
1.2.3 (2016-09-13)
Fixed
@typecheckedskipping the check of return value type when the type annotation wasNone
1.2.2 (2016-08-23)
Fixed checking of homogenous Tuple declarations (
Tuple[bool, ...])
1.2.1 (2016-06-29)
Use
backports.typingwhen possible to get new features on older PythonsFixed incompatibility with Python 3.5.2
1.2.0 (2016-05-21)
Fixed argument counting when a class is checked against a Callable specification
Fixed argument counting when a functools.partial object is checked against a Callable specification
Added checks against mandatory keyword-only arguments when checking against a Callable specification
1.1.3 (2016-05-09)
Gracefully exit if
check_type_argumentscan’t find a reference to the current function
1.1.2 (2016-05-08)
Fixed TypeError when checking a builtin function against a parametrized Callable
1.1.1 (2016-01-03)
Fixed improper argument counting with bound methods when typechecking callables
1.1.0 (2016-01-02)
Eliminated the need to pass a reference to the currently executing function to
check_argument_types()
1.0.2 (2016-01-02)
Fixed types of default argument values not being considered as valid for the argument
1.0.1 (2016-01-01)
Fixed type hints retrieval being done for the wrong callable in cases where the callable was wrapped with one or more decorators
1.0.0 (2015-12-28)
Initial release