Skip to content

Commit 53d7760

Browse files
Use @deprecated to mark deprecated APIs for type checkers. (#1350)
* use @deprecated Signed-off-by: Michael Carlstrom <[email protected]> * move typing_extensions Signed-off-by: Michael Carlstrom <[email protected]> * Add deprecated to declare_parameters Signed-off-by: Michael Carlstrom <[email protected]> --------- Signed-off-by: Michael Carlstrom <[email protected]> Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
1 parent 5ab016b commit 53d7760

File tree

8 files changed

+64
-27
lines changed

8 files changed

+64
-27
lines changed

rclpy/package.xml

+1
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
<exec_depend>action_msgs</exec_depend>
3838
<exec_depend>ament_index_python</exec_depend>
3939
<exec_depend>builtin_interfaces</exec_depend>
40+
<exec_depend>python3-typing-extensions</exec_depend>
4041
<exec_depend>python3-yaml</exec_depend>
4142
<exec_depend>rosgraph_msgs</exec_depend>
4243
<exec_depend>rpyutils</exec_depend>

rclpy/rclpy/clock.py

+2-5
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
from typing import Callable, Optional, Type, TYPE_CHECKING, TypedDict
1818

1919
from rclpy.impl.implementation_singleton import rclpy_implementation as _rclpy
20+
from typing_extensions import TypeAlias
2021

2122
from .clock_type import ClockType
2223
from .context import Context
@@ -26,10 +27,6 @@
2627
from .utilities import get_default_context
2728

2829

29-
if TYPE_CHECKING:
30-
from typing import TypeAlias
31-
32-
3330
class ClockChange(IntEnum):
3431
ROS_TIME_NO_CHANGE = _rclpy.ClockChange.ROS_TIME_NO_CHANGE
3532
ROS_TIME_ACTIVATED = _rclpy.ClockChange.ROS_TIME_ACTIVATED
@@ -90,7 +87,7 @@ class TimeJumpDictionary(TypedDict):
9087
delta: int
9188

9289

93-
JumpHandlePreCallbackType: 'TypeAlias' = Callable[[], None]
90+
JumpHandlePreCallbackType: TypeAlias = Callable[[], None]
9491

9592

9693
class JumpHandle:

rclpy/rclpy/event_handler.py

+5-5
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
from typing import Callable
1818
from typing import List
1919
from typing import Optional
20-
from typing import TYPE_CHECKING
2120
import warnings
2221

2322
import rclpy
@@ -27,9 +26,8 @@
2726
from rclpy.qos import qos_policy_name_from_kind
2827
from rclpy.waitable import NumberOfEntities
2928
from rclpy.waitable import Waitable
30-
31-
if TYPE_CHECKING:
32-
from typing import TypeAlias
29+
from typing_extensions import deprecated
30+
from typing_extensions import TypeAlias
3331

3432

3533
QoSPublisherEventType = _rclpy.rcl_publisher_event_type_t
@@ -75,7 +73,7 @@
7573
UnsupportedEventTypeError = _rclpy.UnsupportedEventTypeError
7674

7775

78-
EventHandlerData: 'TypeAlias' = Optional[Any]
76+
EventHandlerData: TypeAlias = Optional[Any]
7977

8078

8179
class EventHandler(Waitable[EventHandlerData]):
@@ -144,6 +142,8 @@ def destroy(self) -> None:
144142
self.__event.destroy_when_not_in_use()
145143

146144

145+
@deprecated('QoSEventHandler foo is deprecated, use EventHandler instead.',
146+
category=DeprecationWarning, stacklevel=2)
147147
class QoSEventHandler(EventHandler):
148148

149149
def __init_subclass__(cls, **kwargs):

rclpy/rclpy/impl/rcutils_logger.py

+2-8
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,8 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15-
from contextlib import suppress
1615
import inspect
1716
import os
18-
import sys
1917
from types import FrameType
2018
from typing import cast
2119
from typing import ClassVar
@@ -33,12 +31,7 @@
3331
from rclpy.clock import Clock
3432
from rclpy.impl.implementation_singleton import rclpy_implementation as _rclpy
3533
from rclpy.impl.logging_severity import LoggingSeverity
36-
37-
if sys.version_info >= (3, 12):
38-
from typing import Unpack
39-
else:
40-
with suppress(ModuleNotFoundError):
41-
from typing_extensions import Unpack
34+
from typing_extensions import deprecated, Unpack
4235

4336

4437
SupportedFiltersKeys = Literal['throttle', 'skip_first', 'once']
@@ -430,6 +423,7 @@ def warning(self, message: str, **kwargs: 'Unpack[LoggingArgs]') -> bool:
430423
"""Log a message with `WARN` severity via :py:classmethod:RcutilsLogger.log:."""
431424
return self.log(message, LoggingSeverity.WARN, **kwargs)
432425

426+
@deprecated('Deprecated in favor of :py:classmethod:RcutilsLogger.warning:.')
433427
def warn(self, message: str, **kwargs: 'Unpack[LoggingArgs]') -> bool:
434428
"""
435429
Log a message with `WARN` severity via :py:classmethod:RcutilsLogger.log:.

rclpy/rclpy/node.py

+49-1
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,8 @@
9999
from rclpy.validate_parameter_name import validate_parameter_name
100100
from rclpy.validate_topic_name import validate_topic_name
101101
from rclpy.waitable import Waitable
102+
from typing_extensions import deprecated
103+
102104

103105
HIDDEN_NODE_PREFIX = '_'
104106

@@ -375,11 +377,23 @@ def declare_parameter(self, name: str, value: Union[AllowableParameterValueT,
375377
ignore_override: bool = False
376378
) -> Parameter[AllowableParameterValueT]: ...
377379

380+
@overload
381+
@deprecated('when declaring a parameter only providing its name is deprecated. '
382+
'You have to either:\n'
383+
'\t- Pass a name and a default value different to "PARAMETER NOT SET"'
384+
' (and optionally a descriptor).\n'
385+
'\t- Pass a name and a parameter type.\n'
386+
'\t- Pass a name and a descriptor with `dynamic_typing=True')
387+
def declare_parameter(self, name: str,
388+
value: None = None,
389+
descriptor: None = None,
390+
ignore_override: bool = False) -> Parameter[Any]: ...
391+
378392
@overload
379393
def declare_parameter(self, name: str,
380394
value: Union[None, Parameter.Type, ParameterValue] = None,
381395
descriptor: Optional[ParameterDescriptor] = None,
382-
ignore_override: bool = False) -> Parameter[None]: ...
396+
ignore_override: bool = False) -> Parameter[Any]: ...
383397

384398
def declare_parameter(
385399
self,
@@ -417,6 +431,13 @@ def declare_parameter(
417431
args = (name, value, descriptor)
418432
return self.declare_parameters('', [args], ignore_override)[0]
419433

434+
@overload
435+
@deprecated('when declaring a parameter only providing its name is deprecated. '
436+
'You have to either:\n'
437+
'\t- Pass a name and a default value different to "PARAMETER NOT SET"'
438+
' (and optionally a descriptor).\n'
439+
'\t- Pass a name and a parameter type.\n'
440+
'\t- Pass a name and a descriptor with `dynamic_typing=True')
420441
def declare_parameters(
421442
self,
422443
namespace: str,
@@ -427,6 +448,33 @@ def declare_parameters(
427448
ParameterDescriptor],
428449
]],
429450
ignore_override: bool = False
451+
) -> List[Parameter[Any]]: ...
452+
453+
@overload
454+
def declare_parameters(
455+
self,
456+
namespace: str,
457+
parameters: List[Union[
458+
Tuple[str, Parameter.Type],
459+
Tuple[str, Union[AllowableParameterValue, Parameter.Type, ParameterValue],
460+
ParameterDescriptor],
461+
]],
462+
ignore_override: bool = False
463+
) -> List[Parameter[Any]]: ...
464+
465+
def declare_parameters(
466+
self,
467+
namespace: str,
468+
parameters: Union[List[Union[
469+
Tuple[str],
470+
Tuple[str, Parameter.Type],
471+
Tuple[str, Union[AllowableParameterValue, Parameter.Type, ParameterValue],
472+
ParameterDescriptor]]],
473+
List[Union[
474+
Tuple[str, Parameter.Type],
475+
Tuple[str, Union[AllowableParameterValue, Parameter.Type, ParameterValue],
476+
ParameterDescriptor]]]],
477+
ignore_override: bool = False
430478
) -> List[Parameter[Any]]:
431479
"""
432480
Declare a list of parameters.

rclpy/rclpy/qos.py

+3-5
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,13 @@
1313
# limitations under the License.
1414

1515
from enum import Enum, IntEnum
16-
from typing import (Callable, Iterable, List, Optional, Tuple, Type, TYPE_CHECKING,
16+
from typing import (Callable, Iterable, List, Optional, Tuple, Type,
1717
TypeVar, Union)
1818
import warnings
1919

2020
from rclpy.duration import Duration
2121
from rclpy.impl.implementation_singleton import rclpy_implementation as _rclpy
22-
23-
if TYPE_CHECKING:
24-
from typing import TypeAlias
22+
from typing_extensions import TypeAlias
2523

2624

2725
class QoSPolicyKind(IntEnum):
@@ -516,7 +514,7 @@ def get_from_short_key(cls, name: str) -> QoSProfile:
516514
return cls[name.upper()].value
517515

518516

519-
QoSCompatibility: 'TypeAlias' = _rclpy.QoSCompatibility
517+
QoSCompatibility: TypeAlias = _rclpy.QoSCompatibility
520518

521519

522520
def qos_check_compatible(publisher_qos: QoSProfile,

rclpy/rclpy/qos_overriding_options.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,9 @@
3636
from rclpy.qos import QoSProfile
3737
from rclpy.qos import QoSReliabilityPolicy
3838
from rclpy.subscription import Subscription
39+
from typing_extensions import TypeAlias
3940

4041
if TYPE_CHECKING:
41-
from typing import TypeAlias
4242
from rclpy.node import Node
4343

4444

@@ -47,7 +47,7 @@ class InvalidQosOverridesError(Exception):
4747

4848

4949
# Return type of qos validation callbacks
50-
QosCallbackResult: 'TypeAlias' = SetParametersResult
50+
QosCallbackResult: TypeAlias = SetParametersResult
5151
# Qos callback type annotation
5252
QosCallbackType = Callable[[QoSProfile], QosCallbackResult]
5353

rclpy/rclpy/waitable.py

-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020

2121
T = TypeVar('T')
2222

23-
2423
if TYPE_CHECKING:
2524
from typing_extensions import Self
2625

0 commit comments

Comments
 (0)