1
1
import json
2
- from dataclasses import dataclass
2
+ from dataclasses import dataclass , field
3
3
from typing import Optional , Union , Dict , List , Set
4
4
from enum import Enum
5
5
from nucleus .constants import (
@@ -73,7 +73,7 @@ def to_json(self) -> str:
73
73
@dataclass
74
74
class Frame :
75
75
index : Union [int , None ] = None
76
- items : Dict [str , SceneDatasetItem ] = {}
76
+ items : Dict [str , SceneDatasetItem ] = field ( default_factory = dict )
77
77
78
78
def __post_init__ (self ):
79
79
for key , value in self .items .items ():
@@ -98,15 +98,15 @@ def to_payload(self) -> dict:
98
98
@dataclass
99
99
class Scene :
100
100
reference_id : str
101
- frames : List [Frame ] = []
101
+ frames : List [Frame ] = field ( default_factory = list )
102
102
metadata : Optional [dict ] = None
103
103
104
104
def __post_init__ (self ):
105
105
self .check_valid_frame_indices ()
106
- if ( all ([ frame .index is not None for frame in self .frames ] )):
106
+ if all (( frame .index is not None for frame in self .frames )):
107
107
self .frames_dict = {frame .index : frame for frame in self .frames }
108
108
else :
109
- self .frames_dict = { i : frame for i , frame in enumerate (self .frames )}
109
+ self .frames_dict = dict ( enumerate (self .frames ))
110
110
111
111
# TODO: move validation to scene upload
112
112
assert isinstance (self .frames , List ), "frames must be a list"
@@ -120,9 +120,15 @@ def __post_init__(self):
120
120
), "reference_id must be a string"
121
121
122
122
def check_valid_frame_indices (self ):
123
- infer_from_list_position = all ([frame .index is None for frame in self .frames ])
124
- explicit_frame_order = all ([frame .index is not None for frame in self .frames ])
125
- assert infer_from_list_position or explicit_frame_order , "Must specify index explicitly for all frames or implicitly for all frames (inferred from list position)"
123
+ infer_from_list_position = all (
124
+ (frame .index is None for frame in self .frames )
125
+ )
126
+ explicit_frame_order = all (
127
+ (frame .index is not None for frame in self .frames )
128
+ )
129
+ assert (
130
+ infer_from_list_position or explicit_frame_order
131
+ ), "Must specify index explicitly for all frames or implicitly for all frames (inferred from list position)"
126
132
127
133
def add_item (self , item : SceneDatasetItem , index : int , sensor_name : str ):
128
134
if index not in self .frames_dict :
@@ -132,17 +138,23 @@ def add_item(self, item: SceneDatasetItem, index: int, sensor_name: str):
132
138
self .frames_dict [index ].items [sensor_name ] = item
133
139
134
140
def add_frame (self , frame : Frame , update : bool = False ):
135
- assert frame .index is not None , "Must specify index explicitly when calling add_frame"
136
- if frame .index not in self .frames_dict or frame .index in self .frames_dict and update :
141
+ assert (
142
+ frame .index is not None
143
+ ), "Must specify index explicitly when calling add_frame"
144
+ if (
145
+ frame .index not in self .frames_dict
146
+ or frame .index in self .frames_dict
147
+ and update
148
+ ):
137
149
self .frames_dict [frame .index ] = frame
138
150
139
151
def to_payload (self ) -> dict :
140
152
frames_payload = [frame .to_payload () for frame in self .frames ]
141
- if len (frames_payload ) > 0 and frames_payload [0 ]. index is None :
142
- for i in range ( len ( frames_payload ) ):
143
- frames_payload [INDEX_KEY ] = i
153
+ if len (frames_payload ) > 0 and frames_payload [0 ][ INDEX_KEY ] is None :
154
+ for i , _ in enumerate ( frames_payload ):
155
+ frames_payload [i ][ INDEX_KEY ] = i
144
156
else :
145
- frames_payload .sort (lambda x : x [INDEX_KEY ])
157
+ frames_payload .sort (key = lambda x : x [INDEX_KEY ])
146
158
147
159
return {
148
160
REFERENCE_ID_KEY : self .reference_id ,
0 commit comments