A TreeNode which knows its own name. Implements path-like relationships to other nodes in its tree.
| 672 | |
| 673 | |
| 674 | class NamedNode(TreeNode): |
| 675 | """ |
| 676 | A TreeNode which knows its own name. |
| 677 | |
| 678 | Implements path-like relationships to other nodes in its tree. |
| 679 | """ |
| 680 | |
| 681 | _name: str | None |
| 682 | |
| 683 | def __init__( |
| 684 | self, |
| 685 | name: str | None = None, |
| 686 | children: Mapping[str, Self] | None = None, |
| 687 | ): |
| 688 | super().__init__(children=children) |
| 689 | _validate_name(name) |
| 690 | self._name = name |
| 691 | |
| 692 | @property |
| 693 | def name(self) -> str | None: |
| 694 | """The name of this node.""" |
| 695 | return self._name |
| 696 | |
| 697 | @name.setter |
| 698 | def name(self, name: str | None) -> None: |
| 699 | if self.parent is not None: |
| 700 | raise ValueError( |
| 701 | "cannot set the name of a node which already has a parent. " |
| 702 | "Consider creating a detached copy of this node via .copy() " |
| 703 | "on the parent node." |
| 704 | ) |
| 705 | _validate_name(name) |
| 706 | self._name = name |
| 707 | |
| 708 | def __repr__(self, level=0): |
| 709 | repr_value = "\t" * level + self.__str__() + "\n" |
| 710 | for child in self.children: |
| 711 | repr_value += self.get(child).__repr__(level + 1) |
| 712 | return repr_value |
| 713 | |
| 714 | def __str__(self) -> str: |
| 715 | name_repr = repr(self.name) if self.name is not None else "" |
| 716 | return f"NamedNode({name_repr})" |
| 717 | |
| 718 | def _post_attach(self, parent: Self, name: str) -> None: |
| 719 | """Ensures child has name attribute corresponding to key under which it has been stored.""" |
| 720 | _validate_name(name) # is this check redundant? |
| 721 | self._name = name |
| 722 | |
| 723 | def _copy_node( |
| 724 | self, inherit: bool, deep: bool = False, memo: dict[int, Any] | None = None |
| 725 | ) -> Self: |
| 726 | """Copy just one node of a tree""" |
| 727 | new_node = super()._copy_node(inherit=inherit, deep=deep, memo=memo) |
| 728 | new_node._name = self.name |
| 729 | return new_node |
| 730 | |
| 731 | @property |
no outgoing calls
searching dependent graphs…