diff --git a/rosidl_generator_py/resource/_action.py.em b/rosidl_generator_py/resource/_action.py.em index 0a081993..923396fa 100644 --- a/rosidl_generator_py/resource/_action.py.em +++ b/rosidl_generator_py/resource/_action.py.em @@ -50,7 +50,7 @@ class Metaclass_@(action.namespaced_type.name)(rosidl_pycommon.interface_base_cl @@classmethod def __import_type_support__(cls) -> None: try: - from rosidl_generator_py import import_type_support + from rosidl_generator_py import import_type_support # type: ignore[attr-defined] module = import_type_support('@(package_name)') except ImportError: import logging diff --git a/rosidl_generator_py/resource/_idl.py.em b/rosidl_generator_py/resource/_idl.py.em index 98fb0b13..e2e24720 100644 --- a/rosidl_generator_py/resource/_idl.py.em +++ b/rosidl_generator_py/resource/_idl.py.em @@ -5,15 +5,22 @@ from __future__ import annotations import collections.abc -from os import getenv +import os import typing import rosidl_pycommon.interface_base_classes +if typing.TYPE_CHECKING: + from ctypes import Structure + + class PyCapsule(Structure): + pass # don't need to define the full structure + + # This is being done at the module level and not on the instance level to avoid looking # for the same variable multiple times on each instance. This variable is not supposed to # change during runtime so it makes sense to only look for it once. -ros_python_check_fields = getenv('ROS_PYTHON_CHECK_FIELDS', default='') +ros_python_check_fields = os.getenv('ROS_PYTHON_CHECK_FIELDS', default='') @ @####################################################################### @# EmPy template for generating _.py files diff --git a/rosidl_generator_py/resource/_msg.py.em b/rosidl_generator_py/resource/_msg.py.em index 98285ecb..902cace3 100644 --- a/rosidl_generator_py/resource/_msg.py.em +++ b/rosidl_generator_py/resource/_msg.py.em @@ -38,13 +38,6 @@ type_annotations_setter: dict[str, str] = {} type_annotations_getter: dict[str, str] = {} type_imports: set[str] = set() -# Types which always exist -# Done in one multi-line string to preserve order -type_imports.add( - """from ctypes import Structure - - class PyCapsule(Structure): - pass # don't need to define the full structure""") for member in message.structure.members: setter_type, getter_type = get_setter_and_getter_type(member, type_imports) type_annotations_setter[member.name] = setter_type @@ -63,21 +56,18 @@ for member in message.structure.members: }@ @{ suffix = '__'.join(message.structure.namespaced_type.namespaces[1:]) + '__' + convert_camel_case_to_lower_case_underscore(message.structure.namespaced_type.name) -type_annotations_import_statements_copy = type_annotations_import_statements.copy() +new_typing_imports = sorted(type_imports - type_annotations_import_statements) }@ +@[if new_typing_imports]@ if typing.TYPE_CHECKING: -@[for type_import in type_imports]@ -@[if type_import not in type_annotations_import_statements]@ - @(type_import) +@[ for type_import in new_typing_imports]@ + @(type_import) # noqa: E402, I300 @{ type_annotations_import_statements.add(type_import) }@ -@[end if]@ -@[end for]@ -@[if type_annotations_import_statements == type_annotations_import_statements_copy]@ - pass +@[ end for]@ @[end if]@ @#<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< @# Collect necessary import statements for all members diff --git a/rosidl_generator_py/resource/_srv.py.em b/rosidl_generator_py/resource/_srv.py.em index 3320ff22..d20a467a 100644 --- a/rosidl_generator_py/resource/_srv.py.em +++ b/rosidl_generator_py/resource/_srv.py.em @@ -46,7 +46,7 @@ class Metaclass_@(service.namespaced_type.name)(rosidl_pycommon.interface_base_c @@classmethod def __import_type_support__(cls) -> None: try: - from rosidl_generator_py import import_type_support + from rosidl_generator_py import import_type_support # type: ignore[attr-defined] module = import_type_support('@(package_name)') except ImportError: import logging