entity.py 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. """
  2. Entity - 实体抽象类
  3. 支持状态 Diff、TTL 过期、metadata 扩展
  4. """
  5. from __future__ import annotations
  6. from dataclasses import dataclass, field
  7. from typing import Any
  8. import time
  9. @dataclass
  10. class Entity:
  11. """
  12. 实体抽象类
  13. Attributes:
  14. entity_id: 实体唯一标识
  15. entity_type: 实体类型 (animal, obstacle, person, actuator, etc.)
  16. state: 当前状态字典
  17. metadata: 元数据字典 (source, confidence, timestamp, etc.)
  18. last_update: 最后更新时间戳
  19. ttl: 生存时间 (秒),None 表示永不过期
  20. """
  21. entity_id: str
  22. entity_type: str
  23. state: dict = field(default_factory=dict)
  24. metadata: dict | None = None
  25. last_update: float = field(default_factory=time.time)
  26. ttl: float | None = None
  27. def is_expired(self, current_time: float | None = None) -> bool:
  28. """检查实体是否已过期"""
  29. if self.ttl is None:
  30. return False
  31. if current_time is None:
  32. current_time = time.time()
  33. return (current_time - self.last_update) > self.ttl
  34. def update_state(self, new_state: dict, current_time: float | None = None) -> dict:
  35. """
  36. 更新实体状态,返回状态变化 (Diff)
  37. Args:
  38. new_state: 新状态字典
  39. current_time: 当前时间戳
  40. Returns:
  41. 状态变化字典
  42. """
  43. if current_time is None:
  44. current_time = time.time()
  45. diff = {}
  46. for key, value in new_state.items():
  47. old_value = self.state.get(key)
  48. if old_value != value:
  49. diff[key] = {'old': old_value, 'new': value}
  50. self.state[key] = value
  51. self.last_update = current_time
  52. return diff
  53. def update_metadata(self, metadata: dict) -> None:
  54. """更新元数据"""
  55. if self.metadata is None:
  56. self.metadata = {}
  57. self.metadata.update(metadata)
  58. def to_dict(self) -> dict:
  59. """转换为字典"""
  60. return {
  61. 'id': self.entity_id,
  62. 'type': self.entity_type,
  63. 'state': self.state,
  64. 'metadata': self.metadata,
  65. 'last_update': self.last_update,
  66. 'ttl': self.ttl,
  67. }
  68. @classmethod
  69. def from_dict(cls, data: dict) -> Entity:
  70. """从字典创建实体"""
  71. return cls(
  72. entity_id=data['id'],
  73. entity_type=data['type'],
  74. state=data.get('state', {}),
  75. metadata=data.get('metadata'),
  76. last_update=data.get('last_update', time.time()),
  77. ttl=data.get('ttl'),
  78. )