Skip to content

Commit b74d0a7

Browse files
Update parameter types (#1441)
* Update Parameter types Signed-off-by: Michael Carlstrom <[email protected]> * Undo unecssary change Signed-off-by: Michael Carlstrom <[email protected]> --------- Signed-off-by: Michael Carlstrom <[email protected]>
1 parent f964667 commit b74d0a7

File tree

7 files changed

+172
-97
lines changed

7 files changed

+172
-97
lines changed

rclpy/rclpy/node.py

Lines changed: 26 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,12 @@
1919
from typing import Any
2020
from typing import Callable
2121
from typing import Dict
22+
from typing import Final
2223
from typing import Iterator
2324
from typing import List
2425
from typing import Optional
2526
from typing import overload
27+
from typing import Sequence
2628
from typing import Tuple
2729
from typing import Type
2830
from typing import TypeVar
@@ -100,9 +102,10 @@
100102
from rclpy.validate_topic_name import validate_topic_name
101103
from rclpy.waitable import Waitable
102104
from typing_extensions import deprecated
105+
from typing_extensions import TypeAlias
103106

104107

105-
HIDDEN_NODE_PREFIX = '_'
108+
HIDDEN_NODE_PREFIX: Final = '_'
106109

107110
# Left to support Legacy TypeVar.
108111
MsgType = TypeVar('MsgType')
@@ -113,7 +116,7 @@
113116

114117
# Re-export exception defined in _rclpy C extension.
115118
# `Node.get_*_names_and_types_by_node` methods may raise this error.
116-
NodeNameNonExistentError = _rclpy.NodeNameNonExistentError
119+
NodeNameNonExistentError: TypeAlias = _rclpy.NodeNameNonExistentError
117120

118121

119122
class Node:
@@ -439,49 +442,47 @@ def declare_parameter(
439442
args = (name, value, descriptor)
440443
return self.declare_parameters('', [args], ignore_override)[0]
441444

445+
ParameterInput: TypeAlias = Union[AllowableParameterValue, Parameter.Type, ParameterValue]
446+
442447
@overload
443-
@deprecated('when declaring a parameter only providing its name is deprecated. '
444-
'You have to either:\n'
445-
'\t- Pass a name and a default value different to "PARAMETER NOT SET"'
446-
' (and optionally a descriptor).\n'
447-
'\t- Pass a name and a parameter type.\n'
448-
'\t- Pass a name and a descriptor with `dynamic_typing=True')
449448
def declare_parameters(
450449
self,
451450
namespace: str,
452-
parameters: List[Union[
453-
Tuple[str],
454-
Tuple[str, Parameter.Type],
455-
Tuple[str, Union[AllowableParameterValue, Parameter.Type, ParameterValue],
456-
ParameterDescriptor],
451+
parameters: Sequence[Union[
452+
Tuple[str, ParameterInput],
453+
Tuple[str, ParameterInput, ParameterDescriptor],
457454
]],
458455
ignore_override: bool = False
459456
) -> List[Parameter[Any]]: ...
460457

461458
@overload
459+
@deprecated('when declaring a parameter only providing its name is deprecated. '
460+
'You have to either:\n'
461+
'\t- Pass a name and a default value different to "PARAMETER NOT SET"'
462+
' (and optionally a descriptor).\n'
463+
'\t- Pass a name and a parameter type.\n'
464+
'\t- Pass a name and a descriptor with `dynamic_typing=True')
462465
def declare_parameters(
463466
self,
464467
namespace: str,
465-
parameters: List[Union[
466-
Tuple[str, Parameter.Type],
467-
Tuple[str, Union[AllowableParameterValue, Parameter.Type, ParameterValue],
468-
ParameterDescriptor],
468+
parameters: Sequence[Union[
469+
Tuple[str],
470+
Tuple[str, ParameterInput],
471+
Tuple[str, ParameterInput, ParameterDescriptor],
469472
]],
470473
ignore_override: bool = False
471474
) -> List[Parameter[Any]]: ...
472475

473476
def declare_parameters(
474477
self,
475478
namespace: str,
476-
parameters: Union[List[Union[
479+
parameters: Union[Sequence[Union[
477480
Tuple[str],
478-
Tuple[str, Parameter.Type],
479-
Tuple[str, Union[AllowableParameterValue, Parameter.Type, ParameterValue],
480-
ParameterDescriptor]]],
481-
List[Union[
482-
Tuple[str, Parameter.Type],
483-
Tuple[str, Union[AllowableParameterValue, Parameter.Type, ParameterValue],
484-
ParameterDescriptor]]]],
481+
Tuple[str, ParameterInput],
482+
Tuple[str, ParameterInput, ParameterDescriptor]]],
483+
Sequence[Union[
484+
Tuple[str, ParameterInput],
485+
Tuple[str, ParameterInput, ParameterDescriptor]]]],
485486
ignore_override: bool = False
486487
) -> List[Parameter[Any]]:
487488
"""

rclpy/rclpy/parameter.py

Lines changed: 57 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
14+
from __future__ import annotations
1415

1516
import array
1617
from enum import IntEnum
@@ -20,6 +21,7 @@
2021
from typing import Final
2122
from typing import Generic
2223
from typing import List
24+
from typing import Literal
2325
from typing import Optional
2426
from typing import overload
2527
from typing import Tuple
@@ -78,7 +80,7 @@ class Type(IntEnum):
7880
@classmethod
7981
def from_parameter_value(cls,
8082
parameter_value: AllowableParameterValue
81-
) -> 'Parameter.Type':
83+
) -> Parameter.Type:
8284
"""
8385
Get a Parameter.Type from a given variable.
8486
@@ -143,7 +145,7 @@ def check(self, parameter_value: AllowableParameterValue) -> bool:
143145
return False
144146

145147
@classmethod
146-
def from_parameter_msg(cls, param_msg: ParameterMsg) -> 'Parameter[Any]':
148+
def from_parameter_msg(cls, param_msg: ParameterMsg) -> Parameter[Any]:
147149
value = None
148150
type_ = Parameter.Type(value=param_msg.value.type)
149151
if Parameter.Type.BOOL == type_:
@@ -167,17 +169,65 @@ def from_parameter_msg(cls, param_msg: ParameterMsg) -> 'Parameter[Any]':
167169
return cls(param_msg.name, type_, value)
168170

169171
@overload
170-
def __init__(self, name: str, type_: Optional['Parameter.Type'] = None,
171-
value: None = None) -> None: ...
172+
def __init__(self: Parameter[None], name: str) -> None: ...
172173

173174
@overload
174-
def __init__(self, name: str, type_: 'Parameter.Type',
175-
value: AllowableParameterValueT) -> None: ...
175+
def __init__(self: Parameter[None], name: str, type_: Literal[Parameter.Type.NOT_SET]
176+
) -> None: ...
177+
178+
@overload
179+
def __init__(self: Parameter[bool], name: str, type_: Literal[Parameter.Type.BOOL]
180+
) -> None: ...
181+
182+
@overload
183+
def __init__(self: Parameter[int], name: str, type_: Literal[Parameter.Type.INTEGER]
184+
) -> None: ...
185+
186+
@overload
187+
def __init__(self: Parameter[float], name: str, type_: Literal[Parameter.Type.DOUBLE]
188+
) -> None: ...
189+
190+
@overload
191+
def __init__(self: Parameter[str], name: str, type_: Literal[Parameter.Type.STRING]
192+
) -> None: ...
193+
194+
@overload
195+
def __init__(self: Parameter[Union[list[bytes], Tuple[bytes, ...]]],
196+
name: str,
197+
type_: Literal[Parameter.Type.BYTE_ARRAY]) -> None: ...
198+
199+
@overload
200+
def __init__(self: Parameter[Union[list[bool], Tuple[bool, ...]]],
201+
name: str,
202+
type_: Literal[Parameter.Type.BOOL_ARRAY]) -> None: ...
203+
204+
@overload
205+
def __init__(self: Parameter[Union[list[int], Tuple[int, ...], array.array[int]]],
206+
name: str,
207+
type_: Literal[Parameter.Type.INTEGER_ARRAY]) -> None: ...
208+
209+
@overload
210+
def __init__(self: Parameter[Union[list[float], Tuple[float, ...], array.array[float]]],
211+
name: str,
212+
type_: Literal[Parameter.Type.DOUBLE_ARRAY]) -> None: ...
213+
214+
@overload
215+
def __init__(self: Parameter[Union[list[str], Tuple[str, ...], array.array[str]]],
216+
name: str,
217+
type_: Literal[Parameter.Type.STRING_ARRAY]) -> None: ...
176218

177219
@overload
178220
def __init__(self, name: str, *, value: AllowableParameterValueT) -> None: ...
179221

180-
def __init__(self, name: str, type_: Optional['Parameter.Type'] = None, value=None) -> None:
222+
@overload
223+
def __init__(self, name: str, type_: Optional[Parameter.Type] = None,
224+
value: None = None) -> None: ...
225+
226+
@overload
227+
def __init__(self, name: str, type_: Parameter.Type,
228+
value: AllowableParameterValueT) -> None: ...
229+
230+
def __init__(self, name: str, type_: Optional[Parameter.Type] = None, value=None) -> None:
181231
if type_ is None:
182232
# This will raise a TypeError if it is not possible to get a type from the value.
183233
type_ = Parameter.Type.from_parameter_value(value)

rclpy/test/test_events_executor.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import rclpy.executors
2525
import rclpy.experimental
2626
import rclpy.node
27+
import rclpy.parameter
2728
import rclpy.qos
2829
import rclpy.time
2930
import rclpy.timer
@@ -183,7 +184,7 @@ class TimerTestNode(rclpy.node.Node):
183184
def __init__(
184185
self,
185186
index: int = 0,
186-
parameter_overrides: typing.Optional[list[rclpy.Parameter]] = None,
187+
parameter_overrides: typing.Optional[list[rclpy.parameter.Parameter[bool]]] = None,
187188
) -> None:
188189
super().__init__(f'test_timer{index}', parameter_overrides=parameter_overrides)
189190
self._timer_events = 0
@@ -233,7 +234,7 @@ class ActionServerTestNode(rclpy.node.Node):
233234
def __init__(self) -> None:
234235
super().__init__(
235236
'test_action_server_node',
236-
parameter_overrides=[rclpy.Parameter('use_sim_time', value=True)],
237+
parameter_overrides=[rclpy.parameter.Parameter('use_sim_time', value=True)],
237238
)
238239
self._got_goal_future: typing.Optional[rclpy.Future[test_msgs.action.Fibonacci.Goal]] = (
239240
None
@@ -565,7 +566,7 @@ def test_service(self) -> None:
565566
def test_timers(self) -> None:
566567
realtime_node = TimerTestNode(index=0)
567568
rostime_node = TimerTestNode(
568-
index=1, parameter_overrides=[rclpy.Parameter('use_sim_time', value=True)]
569+
index=1, parameter_overrides=[rclpy.parameter.Parameter('use_sim_time', value=True)]
569570
)
570571
clock_node = ClockPublisherNode()
571572
for node in [realtime_node, rostime_node, clock_node]:

0 commit comments

Comments
 (0)