This library adheres to Semantic Versioning 2.0.
4.5.1 (2026-02-19)
- Fixed iterable unpacking incorrectly calculating the cut-off offset of the item list when assigning remaining values to the star variable (#546)
4.5.0 (2026-02-15)
- Restored the
check_argument_types()andcheck_return_type()functions that were dropped in v3.0.0, for users who want more fine-grained control over run-time type checking (#437) - Added support for
extra_itemsinTypedDict, allowing users to specify the types for the values of "leftover" keys in a typed dict (keys that weren't explicitly defined in theTypedDictsubclass) (#538) - Fixed
NameErrorwhen evaluating forward references on Python 3.14 (#536; PR by @dionhaefner) - Fixed protocol check incorrectly rejecting inherited classmethods and staticmethods (#539)
- Fixed missing
TypeCheckErrorwhen checkingTypedDictwithRequired[...]annotations (#533; PR by @dionhaefner) - Fixed type aliases (e.g.
type Foo = list[int]) not being resolved during type checking (#526) - Fixed type-checked assignments to a single tuple target (e.g.
x, = ("foo",)) falsely raisingTypeCheckedError(#535)
4.4.4 (2025-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 arguments - Fixed 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 API - Changed
@typecheckedto skip instrumentation in optimized mode, as in typeguard 2.x - Avoid 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 import - Fixed
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 reference - Fixed 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 justAny - Fixed instrumentation inadvertently mutating a function's annotations on Python 3.7 and 3.8
- Fixed
Concatenate[...]inCallableparameters causingTypeErrorto be raised - Fixed type checks for
*argsor**kwargsnot being suppressed when their types are unusable (guarded byif TYPE_CHECKING:or otherwise) - Fixed
TypeErrorwhen checking against a genericNewType - Don'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 references - Fixed 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 versions - Fixed 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 API - BACKWARD INCOMPATIBLE Required checkers to use the configuration from
memo.config, rather than the global configuration - Added keyword arguments to
@typechecked, allowing users to override settings on a per-function basis - Added support for using
suppress_type_checks()as a decorator - Added 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:blocks - Fixed
check_typenot returning the passed value when checking againstAny, or when type checking is being suppressed - Fixed
suppress_type_checks()not ending the suppression if the context block raises an exception - Fixed 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 occurred - Fixed local assignment to
*argsor**kwargsbeing type checked incorrectly - Fixed
TypeErroroncheck_type(..., None) - Fixed unpacking assignment not working with a starred variable (
x, *y = ...) in the target tuple - Fixed 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 incorrectly - Fixed
@typecheckedattempting to instrument wrapper decorators such as@contextmanagerwhen applied to a class - Fixed
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 thetypeguardmodule - BACKWARD 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_ITEMS - BACKWARD INCOMPATIBLE Type checking failures now raise
typeguard.TypeCheckErrorinstead ofTypeError - Dropped 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 versions - Added support for generic built-in collection types (
list[int]et al) on all Python versions - Added support for checking arbitrary
Mappingtypes - Added support for the
Selftype - Added support for
typing.Never(andtyping_extensions.Never) - Added support for
NeverandNoReturnin argument annotations - Added support for
LiteralString - Added support for
TypeGuard - Added support for the subclassable
Anyon Python 3.11 andtyping_extensions - Added the possibility to have the import hook instrument all packages
- Added the
suppress_type_checks()context manager function for temporarily disabling type checks - Much 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 checking - Replaced custom implementation of
is_typeddict()with the implementation fromtyping_extensionsv4.1.0 - Emit
InstrumentationWarninginstead of raisingRuntimeErrorfrom the pytest plugin if modules in the target package have already been imported - Fixed
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], respectively - Fixed 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 properties - Fixed 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.10 - Fixed
NewTypenot being checked on Python 3.10 - Fixed unwarranted warning when
@typecheckedis applied to a class that contains unannotated properties - Fixed
TypeErrorin the async generator wrapper due to changes in__aiter__()protocol - Fixed 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 fails - Allowed
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
Literal - Added support for
TypedDictinheritance (with some caveats; see the user guide on that for details) - An appropriate
TypeErroris now raised when encountering an illegalLiteralvalue - Fixed checking
NoReturnon Python < 3.8 whentyping_extensionswas not installed - Fixed 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.NoReturn - Added 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 references - Fixed 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 resolved - Fixed 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 memo - Fixed error message when checking against a
Unioncontaining aLiteral
2.7.1 (2019-12-27)
- Fixed
@typecheckedreturningNonewhen called withalways=Trueand Python runs in optimized mode - Fixed 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.Protocolsubclasses - Added support for
typing.AbstractSet - Fixed the handling of
total=FalseinTypedDict - Fixed no error reported on unknown keys with
TypedDict - Removed 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 it - Fixed
AttributeErrorwhen using@typecheckedon a metaclass - Fixed
@typecheckedcompatibility with built-in function wrappers - Fixed 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__()method - Fixed class methods and static methods being wrapped incorrectly when
@typecheckedis applied to the class - Fixed
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 thetypingmodule - Fixed 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
@typechecked - Added a pytest plugin that activates the import hook
- Added support for
typing.TypedDict - Deprecated
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 functions - Fixed
TypeErrorbeing wrapped inside another TypeError (PR by russok)
2.5.0 (2019-08-26)
- Added yield type checking via
TypeCheckerfor regular generators - Added yield, send and return type checking via
@typecheckedfor regular and async generators - Silenced
TypeCheckerwarnings about async generators - Fixed bogus
TypeErroronType[Any] - Fixed bogus
TypeCheckerwarnings when an exception is raised from a type checked function - Accept a
bytearraywherebytesare expected, as per python/typing#552 - Added policies for dealing with unmatched forward references
- Added support for using
@typecheckedas a class decorator - Added
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.Literal - Make 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 derivatives - Fixed 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.7 - Shortened unnecessarily long tracebacks by raising a new
TypeErrorbased on the old one - Allowed 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 installed - Fixed 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 variables - Fixed 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.getfullargspec - Added 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 Pythons - Fixed 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