Title: better features repr
Author: lhoestq (MEMBER)
State: closed
Created: 2025-06-25T14:37:32Z

following the addition of List in #7634 

before:

```python
In [3]: ds.features
Out[3]: 
{'json': {'id': Value(dtype='string', id=None),
  'metadata:transcript': [{'end': Value(dtype='float64', id=None),
    'start': Value(dtype='float64', id=None),
    'transcript': Value(dtype='string', id=None),
    'words': [{'end': Value(dtype='float64', id=None),
      'score': Value(dtype='float64', id=None),
      'start': Value(dtype='float64', id=None),
      'word': Value(dtype='string', id=None)}]}],
  'metadata:vad': [{'end': Value(dtype='float64', id=None),
    'start': Value(dtype='float64', id=None)}]},
 'mp4': Value(dtype='binary', id=None),
 'npz': {'boxes_and_keypoints:box': Sequence(feature=Sequence(feature=Value(dtype='float32', id=None), length=-1, id=None), length=-1, id=None),
  'boxes_and_keypoints:is_valid_box': Sequence(feature=Value(dtype='bool', id=None), length=-1, id=None),
  'boxes_and_keypoints:keypoints': Sequence(feature=Sequence(feature=Sequence(feature=Value(dtype='float32', id=None), length=-1, id=None), length=-1, id=None), length=-1, id=None),
  'movement:EmotionArousalToken': Sequence(feature=Sequence(feature=Value(dtype='float32', id=None), length=-1, id=None), length=-1, id=None),
  'movement:EmotionValenceToken': Sequence(feature=Sequence(feature=Value(dtype='float32', id=None), length=-1, id=None), length=-1, id=None),
  'movement:FAUToken': Sequence(feature=Sequence(feature=Value(dtype='float32', id=None), length=-1, id=None), length=-1, id=None),
  'movement:FAUValue': Sequence(feature=Sequence(feature=Value(dtype='float32', id=None), length=-1, id=None), length=-1, id=None),
  'movement:alignment_head_rotation': Sequence(feature=Sequence(feature=Value(dtype='float32', id=None), length=-1, id=None), length=-1, id=None),
  'movement:alignment_translation': Sequence(feature=Sequence(feature=Sequence(feature=Value(dtype='float32', id=None), length=-1, id=None), length=-1, id=None), length=-1, id=None),
  'movement:emotion_arousal': Sequence(feature=Sequence(feature=Value(dtype='float32', id=None), length=-1, id=None), length=-1, id=None),
  'movement:emotion_scores': Sequence(feature=Sequence(feature=Value(dtype='float32', id=None), length=-1, id=None), length=-1, id=None),
  'movement:emotion_valence': Sequence(feature=Sequence(feature=Value(dtype='float32', id=None), length=-1, id=None), length=-1, id=None),
  'movement:expression': Sequence(feature=Sequence(feature=Value(dtype='float32', id=None), length=-1, id=None), length=-1, id=None),
  'movement:frame_latent': Sequence(feature=Sequence(feature=Value(dtype='float32', id=None), length=-1, id=None), length=-1, id=None),
  'movement:gaze_encodings': Sequence(feature=Sequence(feature=Value(dtype='float32', id=None), length=-1, id=None), length=-1, id=None),
  'movement:head_encodings': Sequence(feature=Sequence(feature=Value(dtype='float32', id=None), length=-1, id=None), length=-1, id=None),
  'movement:hypernet_features': Sequence(feature=Sequence(feature=Value(dtype='float32', id=None), length=-1, id=None), length=-1, id=None),
  'movement:is_valid': Sequence(feature=Sequence(feature=Value(dtype='float32', id=None), length=-1, id=None), length=-1, id=None),
  'smplh:body_pose': Sequence(feature=Sequence(feature=Sequence(feature=Value(dtype='float32', id=None), length=-1, id=None), length=-1, id=None), length=-1, id=None),
  'smplh:global_orient': Sequence(feature=Sequence(feature=Value(dtype='float32', id=None), length=-1, id=None), length=-1, id=None),
  'smplh:is_valid': Sequence(feature=Value(dtype='bool', id=None), length=-1, id=None),
  'smplh:left_hand_pose': Sequence(feature=Sequence(feature=Sequence(feature=Value(dtype='float32', id=None), length=-1, id=None), length=-1, id=None), length=-1, id=None),
  'smplh:right_hand_pose': Sequence(feature=Sequence(feature=Sequence(feature=Value(dtype='float32', id=None), length=-1, id=None), length=-1, id=None), length=-1, id=None),
  'smplh:translation': Sequence(feature=Sequence(feature=Value(dtype='float32', id=None), length=-1, id=None), length=-1, id=None)},
 'wav': Audio(sampling_rate=None, mono=True, decode=True, id=None),
 '__key__': Value(dtype='string', id=None),
 '__url__': Value(dtype='string', id=None)}
```

after:

```python
In [3]: ds.features
Out[3]: 
{'json': {'id': Value('string'),
  'metadata:transcript': List({'end': Value('float64'), 'start': Value('float64'), 'transcript': Value('string'), 'words': List({'end': Value('float64'), 'score': Value('float64'), 'start': Value('float64'), 'word': Value('string')})}),
  'metadata:vad': List({'end': Value('float64'), 'start': Value('float64')})},
 'mp4': Value('binary'),
 'npz': {'boxes_and_keypoints:box': List(List(Value('float32'))),
  'boxes_and_keypoints:is_valid_box': List(Value('bool')),
  'boxes_and_keypoints:keypoints': List(List(List(Value('float32')))),
  'movement:EmotionArousalToken': List(List(Value('float32'))),
  'movement:EmotionValenceToken': List(List(Value('float32'))),
  'movement:FAUToken': List(List(Value('float32'))),
  'movement:FAUValue': List(List(Value('float32'))),
  'movement:alignment_head_rotation': List(List(Value('float32'))),
  'movement:alignment_translation': List(List(List(Value('float32')))),
  'movement:emotion_arousal': List(List(Value('float32'))),
  'movement:emotion_scores': List(List(Value('float32'))),
  'movement:emotion_valence': List(List(Value('float32'))),
  'movement:expression': List(List(Value('float32'))),
  'movement:frame_latent': List(List(Value('float32'))),
  'movement:gaze_encodings': List(List(Value('float32'))),
  'movement:head_encodings': List(List(Value('float32'))),
  'movement:hypernet_features': List(List(Value('float32'))),
  'movement:is_valid': List(List(Value('float32'))),
  'smplh:body_pose': List(List(List(Value('float32')))),
  'smplh:global_orient': List(List(Value('float32'))),
  'smplh:is_valid': List(Value('bool')),
  'smplh:left_hand_pose': List(List(List(Value('float32')))),
  'smplh:right_hand_pose': List(List(List(Value('float32')))),
  'smplh:translation': List(List(Value('float32')))},
 'wav': Audio(sampling_rate=None, decode=True, stream_index=None),
 '__key__': Value('string'),
 '__url__': Value('string')}
```

Comments:
The docs for this PR live [here](https://moon-ci-docs.huggingface.co/docs/datasets/pr_7640). All of your documentation changes will be reflected on that endpoint. The docs are available until 30 days after the last update.