From c7520b1d511cad40520fc42b7dfd0041b316365a Mon Sep 17 00:00:00 2001 From: HansBug Date: Mon, 19 Jul 2021 11:18:06 +0800 Subject: [PATCH] add new part --- treevalue/tree/__init__.py | 2 ++ treevalue/tree/common/tree.py | 2 ++ treevalue/tree/tree/__init__.py | 1 + treevalue/tree/tree/tree.py | 53 +++++++++++++++++++++++++++++++++ treevalue/tree/tree/utils.py | 5 ++++ 5 files changed, 63 insertions(+) create mode 100644 treevalue/tree/tree/__init__.py create mode 100644 treevalue/tree/tree/tree.py create mode 100644 treevalue/tree/tree/utils.py diff --git a/treevalue/tree/__init__.py b/treevalue/tree/__init__.py index e69de29bb2..356f6feb8b 100644 --- a/treevalue/tree/__init__.py +++ b/treevalue/tree/__init__.py @@ -0,0 +1,2 @@ +from .common import * +from .tree import * diff --git a/treevalue/tree/common/tree.py b/treevalue/tree/common/tree.py index 68ef07c1ec..aaae2f8c62 100644 --- a/treevalue/tree/common/tree.py +++ b/treevalue/tree/common/tree.py @@ -1,3 +1,4 @@ +from functools import wraps from typing import Dict, Any, Union, List from .base import BaseTree @@ -5,6 +6,7 @@ from ...utils import init_magic def _to_tree_decorator(init_func): + @wraps(init_func) def _new_init_func(data): if isinstance(data, Tree): _new_init_func(data.to_json()) diff --git a/treevalue/tree/tree/__init__.py b/treevalue/tree/tree/__init__.py new file mode 100644 index 0000000000..15fe209aa6 --- /dev/null +++ b/treevalue/tree/tree/__init__.py @@ -0,0 +1 @@ +from .tree import TreeValue diff --git a/treevalue/tree/tree/tree.py b/treevalue/tree/tree/tree.py new file mode 100644 index 0000000000..4d7e74813d --- /dev/null +++ b/treevalue/tree/tree/tree.py @@ -0,0 +1,53 @@ +from functools import wraps + +from ..common import BaseTree, Tree +from ...utils import init_magic + +_DATA_PROPERTY = '_property__data' +_PRESERVED_PROPERTIES = { + _DATA_PROPERTY, +} + + +def _get_data_property(t: 'TreeValue') -> BaseTree: + return getattr(t, _DATA_PROPERTY) + + +def _init_decorate(init_func): + @wraps(init_func) + def _new_init_func(data): + if isinstance(data, TreeValue): + _new_init_func(_get_data_property(data)) + elif isinstance(data, dict): + _new_init_func(Tree(data)) + elif isinstance(data, Tree): + init_func(data) + else: + raise TypeError( + "Unknown initialization type for tree value - {type}.".format(type=repr(type(data).__name__))) + + return _new_init_func + + +@init_magic(_init_decorate) +class TreeValue: + def __init__(self, data: BaseTree): + setattr(self, _DATA_PROPERTY, data) + + def __getattr__(self, key): + if key in _PRESERVED_PROPERTIES: + return object.__getattribute__(key) + else: + return _get_data_property(self).__getitem__(key) + + def __setattr__(self, key, value): + if key in _PRESERVED_PROPERTIES: + object.__setattr__(self, key, value) + else: + return _get_data_property(self).__setattr__(key, value) + + def __delattr__(self, key): + if key in _PRESERVED_PROPERTIES: + object.__delattr__(self, key) + else: + return _get_data_property(self).__delattr__(key) diff --git a/treevalue/tree/tree/utils.py b/treevalue/tree/tree/utils.py new file mode 100644 index 0000000000..8ee0ba48c9 --- /dev/null +++ b/treevalue/tree/tree/utils.py @@ -0,0 +1,5 @@ +from .tree import TreeValue, _get_data_property + + +def to_json(tree: TreeValue): + return _get_data_property(tree).to_json() -- GitLab