Skip to content

Commit 15f8181

Browse files
author
Val Brodsky
committed
Allow pydantic to deserialize Conversation/Text Entities correctly
1 parent 914df3d commit 15f8181

File tree

2 files changed

+20
-14
lines changed

2 files changed

+20
-14
lines changed

labelbox/data/serialization/ndjson/label.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,8 @@ def _generate_annotations(
7171

7272
def _infer_media_type(
7373
self, data_row: DataRow,
74-
annotations: List[Union[TextEntity, ConversationEntity, VideoClassificationAnnotation,
74+
annotations: List[Union[TextEntity, ConversationEntity,
75+
VideoClassificationAnnotation,
7576
VideoObjectAnnotation, ObjectAnnotation,
7677
ClassificationAnnotation, ScalarMetric,
7778
ConfusionMatrixMetric]]

labelbox/data/serialization/ndjson/objects.py

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -404,21 +404,23 @@ class NDConversationEntity(NDTextEntity):
404404
message_id: str
405405

406406
def to_common(self) -> ConversationEntity:
407-
return ConversationEntity(start=self.location.start, end=self.location.end, message_id=self.message_id)
407+
return ConversationEntity(start=self.location.start,
408+
end=self.location.end,
409+
message_id=self.message_id)
408410

409411
@classmethod
410-
def from_common(cls,
411-
conversation_entity: ConversationEntity,
412-
classifications: List[ClassificationAnnotation],
413-
name: str,
414-
feature_schema_id: Cuid,
415-
extra: Dict[str, Any],
416-
data: Union[ImageData, TextData],
417-
confidence: Optional[float] = None) -> "NDConversationEntity":
418-
return cls(location=Location(
419-
start=conversation_entity.start,
420-
end=conversation_entity.end),
421-
message_id=conversation_entity.message_id,
412+
def from_common(
413+
cls,
414+
conversation_entity: ConversationEntity,
415+
classifications: List[ClassificationAnnotation],
416+
name: str,
417+
feature_schema_id: Cuid,
418+
extra: Dict[str, Any],
419+
data: Union[ImageData, TextData],
420+
confidence: Optional[float] = None) -> "NDConversationEntity":
421+
return cls(location=Location(start=conversation_entity.start,
422+
end=conversation_entity.end),
423+
message_id=conversation_entity.message_id,
422424
dataRow=DataRow(id=data.uid),
423425
name=name,
424426
schema_id=feature_schema_id,
@@ -500,6 +502,9 @@ def lookup_object(
500502
return result
501503

502504

505+
# NOTE: Deserialization of subclasses in pydantic is a known PIA, see here https://blog.devgenius.io/deserialize-child-classes-with-pydantic-that-gonna-work-784230e1cf83
506+
# I could implement the registry approach suggested there, but I found that if I list subclass (that has more attributes) before the parent class, it works
507+
# This is a bit of a hack, but it works for now
503508
NERTextType = Union[NDConversationEntity, NDTextEntity]
504509
NDObjectType = Union[NDLine, NDPolygon, NDPoint, NDRectangle, NDMask,
505510
NERTextType, NDDocumentEntity]

0 commit comments

Comments
 (0)