Skip to content

Commit c11057a

Browse files
committed
Fixed placement of module level typeguard imports
Fixes #385.
1 parent 068edfd commit c11057a

File tree

3 files changed

+35
-1
lines changed

3 files changed

+35
-1
lines changed

docs/versionhistory.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ This library adheres to `Semantic Versioning 2.0 <https://semver.org/#semantic-v
99
- Fixed ``@typechecked`` optimization causing compilation of instrumented code to fail
1010
when any block was left empty by the AST transformer (eg `if` or `try` / `except` blocks)
1111
(`#352 <https://github.com/agronholm/typeguard/issues/352>`_)
12+
- Fixed placement of injected typeguard imports with respect to ``__future__`` imports and module
13+
docstrings (`#385 <https://github.com/agronholm/typeguard/issues/385>`_)
1214

1315
**4.1.2** (2023-08-18)
1416

src/typeguard/_transformer.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -608,8 +608,9 @@ def visit_Name(self, node: Name) -> Name:
608608
return node
609609

610610
def visit_Module(self, node: Module) -> Module:
611+
self._module_memo = self._memo = TransformMemo(node, None, ())
611612
self.generic_visit(node)
612-
self._memo.insert_imports(node)
613+
self._module_memo.insert_imports(node)
613614

614615
fix_missing_locations(node)
615616
return node

tests/test_transformer.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1624,3 +1624,34 @@ def foo() -> int:
16241624
'''
16251625
).strip()
16261626
)
1627+
1628+
1629+
def test_respect_future_import() -> None:
1630+
# Regression test for #385
1631+
node = parse(
1632+
dedent(
1633+
'''
1634+
"""module docstring"""
1635+
from __future__ import annotations
1636+
1637+
def foo() -> int:
1638+
return 1
1639+
'''
1640+
)
1641+
)
1642+
TypeguardTransformer().visit(node)
1643+
assert (
1644+
unparse(node)
1645+
== dedent(
1646+
'''
1647+
"""module docstring"""
1648+
from __future__ import annotations
1649+
from typeguard import TypeCheckMemo
1650+
from typeguard._functions import check_return_type
1651+
1652+
def foo() -> int:
1653+
memo = TypeCheckMemo(globals(), locals())
1654+
return check_return_type('foo', 1, int, memo)
1655+
'''
1656+
).strip()
1657+
)

0 commit comments

Comments
 (0)