Helper function for `assert_same_structure`.
(nest1, nest2, check_types, skip_if)
| 281 | |
| 282 | |
| 283 | def _recursive_assert_same_structure(nest1, nest2, check_types, skip_if): |
| 284 | """ |
| 285 | Helper function for `assert_same_structure`. |
| 286 | """ |
| 287 | if skip_if is not None and (skip_if(nest1) or skip_if(nest2)): |
| 288 | return |
| 289 | is_sequence_nest1 = is_sequence(nest1) |
| 290 | if is_sequence_nest1 != is_sequence(nest2): |
| 291 | raise ValueError( |
| 292 | "The two structures don't have the same nested structure.\n\n" |
| 293 | f"First structure: {nest1}\n\nSecond structure: {nest2}." |
| 294 | ) |
| 295 | if not is_sequence_nest1: |
| 296 | return # finished checking |
| 297 | if check_types: |
| 298 | type_nest1 = type(nest1) |
| 299 | type_nest2 = type(nest2) |
| 300 | if type_nest1 != type_nest2: |
| 301 | raise TypeError( |
| 302 | "The two structures don't have the same sequence type. First " |
| 303 | f"structure has type {type_nest1}, while second structure has type {type_nest2}." |
| 304 | ) |
| 305 | if isinstance(nest1, dict): |
| 306 | keys1 = set(nest1.keys()) |
| 307 | keys2 = set(nest2.keys()) |
| 308 | if keys1 != keys2: |
| 309 | raise ValueError( |
| 310 | "The two dictionaries don't have the same set of keys. First " |
| 311 | f"structure has keys {keys1}, while second structure has keys {keys2}." |
| 312 | ) |
| 313 | nest1_as_sequence = list(_yield_value(nest1)) |
| 314 | nest2_as_sequence = list(_yield_value(nest2)) |
| 315 | if len(nest1_as_sequence) != len(nest2_as_sequence): |
| 316 | raise ValueError( |
| 317 | "The two structures don't have the same number of elements.\n\n" |
| 318 | f"First structure ({len(nest1_as_sequence)} elements): {nest1}\n\n" |
| 319 | f"Second structure ({len(nest2_as_sequence)} elements): {nest2}" |
| 320 | ) |
| 321 | for n1, n2 in zip(nest1_as_sequence, nest2_as_sequence): |
| 322 | _recursive_assert_same_structure(n1, n2, check_types, skip_if) |
| 323 | |
| 324 | |
| 325 | def padding_to_same_structure(nest1, nest2, obj=None): |
no test coverage detected