|
1 | 1 | @# Included from rosidl_generator_py/resource/_idl.py.em |
2 | 2 | @{ |
3 | | - |
4 | 3 | from rosidl_pycommon import convert_camel_case_to_lower_case_underscore |
5 | 4 | from rosidl_generator_py.generate_py_impl import constant_value_to_py |
6 | 5 | from rosidl_generator_py.generate_py_impl import get_python_type |
@@ -484,177 +483,57 @@ if isinstance(member.type, (Array, AbstractSequence)): |
484 | 483 |
|
485 | 484 | @@@(member.name).setter@(noqa_string) |
486 | 485 | def @(member.name)(self, value: @(type_annotations_setter[member.name])) -> None:@(noqa_string) |
487 | | - |
488 | 486 | @[ if isinstance(member.type, AbstractNestedType)]@ |
489 | | - from collections.abc import Set |
490 | | - if isinstance(value, Set): |
| 487 | + if isinstance(value, collections.abc.Set): |
491 | 488 | import warnings |
492 | 489 | warnings.warn( |
493 | 490 | 'Using set or subclass of set is deprecated,' |
494 | 491 | ' please use a subclass of collections.abc.Sequence like list', |
495 | 492 | DeprecationWarning) |
496 | | -@[ end if]@ |
497 | | - if self._check_fields: |
498 | | -@[ if isinstance(member.type, AbstractNestedType) and isinstance(member.type.value_type, BasicType) and member.type.value_type.typename in SPECIAL_NESTED_BASIC_TYPES]@ |
499 | | -@[ if isinstance(member.type, Array)]@ |
500 | | - if isinstance(value, numpy.ndarray): |
501 | | - assert value.dtype == @(SPECIAL_NESTED_BASIC_TYPES[member.type.value_type.typename]['dtype']), \ |
502 | | - "The '@(member.name)' numpy.ndarray() must have the dtype of '@(SPECIAL_NESTED_BASIC_TYPES[member.type.value_type.typename]['dtype'])'" |
503 | | - assert value.size == @(member.type.size), \ |
504 | | - "The '@(member.name)' numpy.ndarray() must have a size of @(member.type.size)" |
505 | | - self._@(member.name) = value |
506 | | - return |
507 | | -@[ elif isinstance(member.type, AbstractSequence)]@ |
508 | | - if isinstance(value, array.array): |
509 | | - assert value.typecode == '@(SPECIAL_NESTED_BASIC_TYPES[member.type.value_type.typename]['type_code'])', \ |
510 | | - "The '@(member.name)' array.array() must have the type code of '@(SPECIAL_NESTED_BASIC_TYPES[member.type.value_type.typename]['type_code'])'" |
511 | | -@[ if isinstance(member.type, BoundedSequence)]@ |
512 | | - assert len(value) <= @(member.type.maximum_size), \ |
513 | | - "The '@(member.name)' array.array() must have a size <= @(member.type.maximum_size)" |
514 | | -@[ end if]@ |
515 | | - self._@(member.name) = value |
516 | | - return |
517 | | -@[ end if]@ |
518 | 493 | @[ end if]@ |
519 | 494 | @[ if isinstance(type_, NamespacedType)]@ |
520 | 495 | @[ if ( |
521 | 496 | type_.name.endswith(ACTION_GOAL_SUFFIX) or |
522 | 497 | type_.name.endswith(ACTION_RESULT_SUFFIX) or |
523 | 498 | type_.name.endswith(ACTION_FEEDBACK_SUFFIX) |
524 | 499 | )]@ |
525 | | - from @('.'.join(type_.namespaces))._@(convert_camel_case_to_lower_case_underscore(type_.name.rsplit('_', 1)[0])) import @(type_.name) |
| 500 | + from @('.'.join(type_.namespaces))._@(convert_camel_case_to_lower_case_underscore(type_.name.rsplit('_', 1)[0])) import @(type_.name) |
526 | 501 | @[ else]@ |
527 | | - from @('.'.join(type_.namespaces)) import @(type_.name) |
| 502 | + from @('.'.join(type_.namespaces)) import @(type_.name) |
528 | 503 | @[ end if]@ |
529 | 504 | @[ end if]@ |
530 | | -@[ if isinstance(member.type, AbstractNestedType)]@ |
531 | | - from collections.abc import Sequence |
532 | | - from collections import UserString |
533 | | -@[ elif isinstance(type_, AbstractGenericString) and type_.has_maximum_size()]@ |
534 | | - from collections import UserString |
535 | | -@[ elif isinstance(type_, BasicType) and type_.typename in CHARACTER_TYPES]@ |
536 | | - from collections import UserString |
537 | | -@[ end if]@ |
538 | | - assert \ |
539 | | -@[ if isinstance(member.type, AbstractNestedType)]@ |
540 | | - ((isinstance(value, Sequence) or |
541 | | - isinstance(value, Set)) and |
542 | | - not isinstance(value, str) and |
543 | | - not isinstance(value, UserString) and |
544 | | -@{assert_msg_suffixes = ['sequence']}@ |
545 | | -@[ if isinstance(type_, AbstractGenericString) and type_.has_maximum_size()]@ |
546 | | - all(len(val) <= @(type_.maximum_size) for val in value) and |
547 | | -@{assert_msg_suffixes.append('and each string value not longer than %d' % type_.maximum_size)}@ |
548 | | -@[ end if]@ |
549 | | -@[ if isinstance(member.type, (Array, BoundedSequence))]@ |
550 | | -@[ if isinstance(member.type, BoundedSequence)]@ |
551 | | - len(value) <= @(member.type.maximum_size) and |
552 | | -@{assert_msg_suffixes.insert(1, 'with length <= %d' % member.type.maximum_size)}@ |
553 | | -@[ else]@ |
554 | | - len(value) == @(member.type.size) and |
555 | | -@{assert_msg_suffixes.insert(1, 'with length %d' % member.type.size)}@ |
556 | | -@[ end if]@ |
557 | | -@[ end if]@ |
558 | | - all(isinstance(v, @(get_python_type(type_))) for v in value) and |
559 | | -@{assert_msg_suffixes.append("and each value of type '%s'" % get_python_type(type_))}@ |
560 | | -@[ if isinstance(type_, BasicType) and type_.typename in SIGNED_INTEGER_TYPES]@ |
561 | | -@{ |
562 | | -nbits = int(type_.typename[3:]) |
563 | | -bound = 2**(nbits - 1) |
564 | | -}@ |
565 | | - all(val >= -@(bound) and val < @(bound) for val in value)), \ |
566 | | -@{assert_msg_suffixes.append('and each integer in [%d, %d]' % (-bound, bound - 1))}@ |
567 | | -@[ elif isinstance(type_, BasicType) and type_.typename in UNSIGNED_INTEGER_TYPES]@ |
568 | | -@{ |
569 | | -nbits = int(type_.typename[4:]) |
570 | | -bound = 2**nbits |
571 | | -}@ |
572 | | - all(val >= 0 and val < @(bound) for val in value)), \ |
573 | | -@{assert_msg_suffixes.append('and each unsigned integer in [0, %d]' % (bound - 1))}@ |
574 | | -@[ elif isinstance(type_, BasicType) and type_.typename == 'char']@ |
575 | | - all(ord(val) >= 0 and ord(val) < 256 for val in value)), \ |
576 | | -@{assert_msg_suffixes.append('and each char in [0, 255]')}@ |
577 | | -@[ elif isinstance(type_, BasicType) and type_.typename in FLOATING_POINT_TYPES]@ |
578 | | -@[ if type_.typename == "float"]@ |
579 | | -@{ |
580 | | -name = "float" |
581 | | -bound = 3.402823466e+38 |
582 | | -}@ |
583 | | - all(not (val < -@(bound) or val > @(bound)) or math.isinf(val) for val in value)), \ |
584 | | -@{assert_msg_suffixes.append('and each float in [%f, %f]' % (-bound, bound))}@ |
585 | | -@[ elif type_.typename == "double"]@ |
| 505 | + |
586 | 506 | @{ |
587 | | -name = "double" |
588 | | -bound = 1.7976931348623157e+308 |
| 507 | +TEMPLATE( |
| 508 | + '_msg_check_fields.py.em', |
| 509 | + member=member, |
| 510 | + type_=type_, |
| 511 | +) |
589 | 512 | }@ |
590 | | - all(not (val < -@(bound) or val > @(bound)) or math.isinf(val) for val in value)), \ |
591 | | -@{assert_msg_suffixes.append('and each double in [%f, %f]' % (-bound, bound))}@ |
| 513 | + |
| 514 | +@[ if isinstance(member.type, AbstractNestedType)]@ |
| 515 | +@[ if isinstance(member.type.value_type, BasicType) and member.type.value_type.typename in SPECIAL_NESTED_BASIC_TYPES]@ |
| 516 | +@[ if isinstance(member.type, Array)]@ |
| 517 | + if isinstance(value, numpy.ndarray): |
| 518 | +@[ elif isinstance(member.type, AbstractSequence)]@ |
| 519 | + if isinstance(value, array.array): |
592 | 520 | @[ end if]@ |
593 | 521 | @[ else]@ |
594 | | - True), \ |
595 | | -@[ end if]@ |
596 | | - "The '@(member.name)' field must be @(' '.join(assert_msg_suffixes))" |
597 | | -@[ elif isinstance(member.type, AbstractGenericString) and member.type.has_maximum_size()]@ |
598 | | - (isinstance(value, (str, UserString)) and |
599 | | - len(value) <= @(member.type.maximum_size)), \ |
600 | | - "The '@(member.name)' field must be string value " \ |
601 | | - 'not longer than @(type_.maximum_size)' |
602 | | -@[ elif isinstance(type_, NamespacedType)]@ |
603 | | - isinstance(value, @(type_.name)), \ |
604 | | - "The '@(member.name)' field must be a sub message of type '@(type_.name)'" |
605 | | -@[ elif isinstance(type_, BasicType) and type_.typename == 'octet']@ |
606 | | - (isinstance(value, (bytes, bytearray, memoryview)) and |
607 | | - len(value) == 1), \ |
608 | | - "The '@(member.name)' field must be of type 'bytes' or 'ByteString' with length 1" |
609 | | -@[ elif isinstance(type_, BasicType) and type_.typename == 'char']@ |
610 | | - (isinstance(value, (str, UserString)) and |
611 | | - len(value) == 1 and ord(value) >= -128 and ord(value) < 128), \ |
612 | | - "The '@(member.name)' field must be of type 'str' or 'UserString' " \ |
613 | | - 'with length 1 and the character ord() in [-128, 127]' |
614 | | -@[ elif isinstance(type_, AbstractGenericString)]@ |
615 | | - isinstance(value, str), \ |
616 | | - "The '@(member.name)' field must be of type '@(get_python_type(type_))'" |
617 | | -@[ elif isinstance(type_, BasicType) and type_.typename in (BOOLEAN_TYPE, *FLOATING_POINT_TYPES, *INTEGER_TYPES)]@ |
618 | | - isinstance(value, @(get_python_type(type_))), \ |
619 | | - "The '@(member.name)' field must be of type '@(get_python_type(type_))'" |
620 | | -@[ if type_.typename in SIGNED_INTEGER_TYPES]@ |
621 | | -@{ |
622 | | -nbits = int(type_.typename[3:]) |
623 | | -bound = 2**(nbits - 1) |
624 | | -}@ |
625 | | - assert value >= -@(bound) and value < @(bound), \ |
626 | | - "The '@(member.name)' field must be an integer in [@(-bound), @(bound - 1)]" |
627 | | -@[ elif type_.typename in UNSIGNED_INTEGER_TYPES]@ |
628 | | -@{ |
629 | | -nbits = int(type_.typename[4:]) |
630 | | -bound = 2**nbits |
631 | | -}@ |
632 | | - assert value >= 0 and value < @(bound), \ |
633 | | - "The '@(member.name)' field must be an unsigned integer in [0, @(bound - 1)]" |
634 | | -@[ elif type_.typename in FLOATING_POINT_TYPES]@ |
635 | | -@[ if type_.typename == "float"]@ |
636 | | -@{ |
637 | | -name = "float" |
638 | | -bound = 3.402823466e+38 |
639 | | -}@ |
640 | | -@[ elif type_.typename == "double"]@ |
641 | | -@{ |
642 | | -name = "double" |
643 | | -bound = 1.7976931348623157e+308 |
644 | | -}@ |
645 | | -@[ end if]@ |
646 | | - assert not (value < -@(bound) or value > @(bound)) or math.isinf(value), \ |
647 | | - "The '@(member.name)' field must be a @(name) in [@(-bound), @(bound)]" |
| 522 | + if isinstance(value, list): |
648 | 523 | @[ end if]@ |
649 | | -@[ else]@ |
650 | | - False |
| 524 | + self._@(member.name) = value |
| 525 | + return |
651 | 526 | @[ end if]@ |
652 | | -@[ if isinstance(member.type, AbstractNestedType) and isinstance(member.type.value_type, BasicType) and member.type.value_type.typename in SPECIAL_NESTED_BASIC_TYPES]@ |
653 | | -@[ if isinstance(member.type, Array)]@ |
| 527 | +@[ if isinstance(member.type, AbstractNestedType)]@ |
| 528 | +@[ if isinstance(member.type.value_type, BasicType) and member.type.value_type.typename in SPECIAL_NESTED_BASIC_TYPES]@ |
| 529 | +@[ if isinstance(member.type, Array)]@ |
654 | 530 | self._@(member.name) = numpy.array(value, dtype=@(SPECIAL_NESTED_BASIC_TYPES[member.type.value_type.typename]['dtype'])) |
655 | | -@[ elif isinstance(member.type, AbstractSequence)]@ |
| 531 | +@[ elif isinstance(member.type, AbstractSequence)]@ |
656 | 532 | # type ignore below fixed in mypy 1.17+ see mypy#19421 |
657 | 533 | self._@(member.name) = array.array('@(SPECIAL_NESTED_BASIC_TYPES[member.type.value_type.typename]['type_code'])', value) # type: ignore[assignment] |
| 534 | +@[ end if]@ |
| 535 | +@[ else]@ |
| 536 | + self._@(member.name) = list(value) |
658 | 537 | @[ end if]@ |
659 | 538 | @[ else]@ |
660 | 539 | self._@(member.name) = value |
|
0 commit comments