Represents a variable-length list. Values of a list can also be complex fields such as Lists and Structs. In addition to the fields exposed by its `values` field, a List exposes an additional `lengths` field, which will contain the size of each list under the parent domain.
| 199 | |
| 200 | |
| 201 | class List(Field): |
| 202 | """Represents a variable-length list. |
| 203 | |
| 204 | Values of a list can also be complex fields such as Lists and Structs. |
| 205 | In addition to the fields exposed by its `values` field, a List exposes an |
| 206 | additional `lengths` field, which will contain the size of each list under |
| 207 | the parent domain. |
| 208 | """ |
| 209 | |
| 210 | __slots__: Sequence[str] = ("lengths", "_items") |
| 211 | |
| 212 | def __init__(self, values, lengths_blob=None): |
| 213 | if isinstance(lengths_blob, Field): |
| 214 | assert isinstance(lengths_blob, Scalar) |
| 215 | self.lengths = _normalize_field(lengths_blob) |
| 216 | else: |
| 217 | self.lengths = Scalar(np.int32, lengths_blob) |
| 218 | self._items = _normalize_field(values) |
| 219 | self.lengths._set_parent(self, 0) |
| 220 | self._items._set_parent(self, 1) |
| 221 | super().__init__([self.lengths, self._items]) |
| 222 | |
| 223 | def field_names(self): |
| 224 | value_fields = self._items.field_names() |
| 225 | return ( |
| 226 | ['lengths'] + [_join_field_name('values', v) for v in value_fields] |
| 227 | ) |
| 228 | |
| 229 | def field_types(self): |
| 230 | return self.lengths.field_types() + self._items.field_types() |
| 231 | |
| 232 | def field_metadata(self): |
| 233 | return self.lengths.field_metadata() + self._items.field_metadata() |
| 234 | |
| 235 | def field_blobs(self): |
| 236 | return self.lengths.field_blobs() + self._items.field_blobs() |
| 237 | |
| 238 | def all_scalars(self): |
| 239 | return self.lengths.all_scalars() + self._items.all_scalars() |
| 240 | |
| 241 | def has_blobs(self): |
| 242 | return self.lengths.has_blobs() and self._items.has_blobs() |
| 243 | |
| 244 | def clone(self, keep_blobs=True): |
| 245 | return type(self)( |
| 246 | _normalize_field(self._items, keep_blobs=keep_blobs), |
| 247 | _normalize_field(self.lengths, keep_blobs=keep_blobs) |
| 248 | ) |
| 249 | |
| 250 | def _pprint_impl(self, indent, str_buffer): |
| 251 | str_buffer.write(' ' * indent + "List(\n") |
| 252 | str_buffer.write(' ' * (indent + 1) + "lengths=\n") |
| 253 | self.lengths._pprint_impl(indent=indent + 2, str_buffer=str_buffer) |
| 254 | str_buffer.write(' ' * (indent + 1) + "_items=\n") |
| 255 | self._items._pprint_impl(indent=indent + 2, str_buffer=str_buffer) |
| 256 | str_buffer.write(' ' * indent + ")\n") |
| 257 | |
| 258 | def __getattr__(self, item): |
no outgoing calls
searching dependent graphs…