Ditch named tuples for dataclasses.
[python_utils.git] / logical_search.py
index b55e68901501ad2e68a7f45df034866072c3f61b..41ed729fc15df80a4477d3094e4dc980869741aa 100644 (file)
@@ -9,7 +9,8 @@ from __future__ import annotations
 import enum
 import sys
 from collections import defaultdict
-from typing import Any, Dict, List, NamedTuple, Optional, Sequence, Set, Tuple, Union
+from dataclasses import dataclass, field
+from typing import Any, Dict, List, Optional, Sequence, Set, Tuple, Union
 
 
 class ParseError(Exception):
@@ -20,13 +21,22 @@ class ParseError(Exception):
         self.message = message
 
 
-class Document(NamedTuple):
-    """A tuple representing a searchable document."""
+@dataclass
+class Document:
+    """A class representing a searchable document."""
 
-    docid: str  # a unique idenfier for the document
-    tags: Set[str]  # an optional set of tags
-    properties: List[Tuple[str, str]]  # an optional set of key->value properties
-    reference: Any  # an optional reference to something else
+    # A unique identifier for each document.
+    docid: str = ''
+
+    # A set of tag strings for this document.  May be empty.
+    tags: Set[str] = field(default_factory=set)
+
+    # A list of key->value strings for this document.  May be empty.
+    properties: List[Tuple[str, str]] = field(default_factory=list)
+
+    # An optional reference to something else; interpreted only by
+    # caller code, ignored here.
+    reference: Optional[Any] = None
 
 
 class Operation(enum.Enum):