Skip to content

Commit 92bbe31

Browse files
authored
Merge pull request #59 from opendilab/dev/iter
dev(hansbug): update __iter__ and __reversed__
2 parents fcc3548 + fdeca27 commit 92bbe31

File tree

4 files changed

+60
-28
lines changed

4 files changed

+60
-28
lines changed

docs/source/api_doc/tree/tree.rst

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ TreeValue
99
---------------
1010

1111
.. autoclass:: TreeValue
12-
:members: __init__, __getattribute__, __setattr__, __delattr__, __contains__, __repr__, __iter__, __hash__, __eq__, _attr_extern, __len__, __bool__, __str__, __getstate__, __setstate__, get, pop, keys, values, items, __getitem__, __setitem__, __delitem__, _getitem_extern, _setitem_extern, _delitem_extern, popitem, clear, update, setdefault
12+
:members: __init__, __getattribute__, __setattr__, __delattr__, __contains__, __repr__, __iter__, __hash__, __eq__, _attr_extern, __len__, __bool__, __str__, __getstate__, __setstate__, get, pop, keys, values, items, __getitem__, __setitem__, __delitem__, _getitem_extern, _setitem_extern, _delitem_extern, popitem, clear, update, setdefault, __reversed__
1313

1414

1515
.. _apidoc_tree_tree_delayed:

test/tree/tree/test_tree.py

+13-6
Original file line numberDiff line numberDiff line change
@@ -252,12 +252,19 @@ def test_tree_value_repr(self):
252252
def test_tree_value_iter(self):
253253
# Attention: dict(tv1) is not supported in python 3.7+
254254
tv1 = TreeValue({'a': 1, 'b': 2, 'c': {'x': 2, 'y': 3}})
255-
assert sorted(list(tv1)) == [
256-
('a', 1),
257-
('b', 2),
258-
('c', TreeValue({'x': 2, 'y': 3}))
259-
]
260-
assert sorted(list(tv1.c)) == [('x', 2), ('y', 3)]
255+
assert sorted(list(tv1)) == ['a', 'b', 'c']
256+
assert sorted(list(tv1.c)) == ['x', 'y']
257+
258+
def test_tree_value_reversed(self):
259+
tv1 = TreeValue({'a': 1, 'b': 2, 'c': {'x': 2, 'y': 3}})
260+
if _reversible:
261+
assert list(reversed(tv1)) == list(iter(tv1))[::-1]
262+
assert list(reversed(tv1.c)) == list(iter(tv1.c))[::-1]
263+
else:
264+
with pytest.raises(TypeError):
265+
reversed(tv1)
266+
with pytest.raises(TypeError):
267+
reversed(tv1.c)
261268

262269
def test_tree_value_len(self):
263270
tv1 = TreeValue({'a': 1, 'b': 2, 'c': {'x': 2, 'y': 3}})

treevalue/tree/tree/graph.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ def _node_tag(current, parent, current_path, parent_path, is_node):
185185
graph_title=title or "<untitled>",
186186
graph_cfg=cfg or {},
187187
repr_gen=repr_gen or (lambda x: nohtml(repr(x))),
188-
iter_gen=lambda n: iter(n) if isinstance(n, TreeValue) else None,
188+
iter_gen=lambda n: iter(n.items()) if isinstance(n, TreeValue) else None,
189189
node_cfg_gen=_dict_call_merge(lambda n, p, np, pp, is_node, is_root, root: {
190190
'fillcolor': _shape_color(root[2]),
191191
'color': _border_color(root[2], is_node),

treevalue/tree/tree/tree.pyx

+45-20
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,13 @@ from ...utils import format_tree
1515
cdef class _CObject:
1616
pass
1717

18+
try:
19+
reversed({'a': 1}.keys())
20+
except TypeError:
21+
_reversible = False
22+
else:
23+
_reversible = True
24+
1825
cdef inline object _item_unwrap(object v):
1926
if isinstance(v, list) and len(v) == 1:
2027
return v[0]
@@ -529,24 +536,49 @@ cdef class TreeValue:
529536
Overview:
530537
Get iterator of this tree value.
531538
532-
Returns:
533-
- iter (:obj:`iter`): Iterator for keys and values.
539+
:return: An iterator for the keys.
534540
535-
Example:
541+
Examples:
542+
>>> from treevalue import TreeValue
543+
>>>
536544
>>> t = TreeValue({'a': 1, 'b': 2, 'x': 3})
537-
>>> for key, value in t:
538-
>>> print(key, value)
545+
>>> for key in t:
546+
... print(key)
547+
a
548+
b
549+
x
539550
540-
The output will be:
551+
.. note::
552+
The method :meth:`__iter__`'s bahaviour should be similar to \
553+
`dict.__iter__ <https://docs.python.org/3/library/stdtypes.html#dict.update>`_.
554+
"""
555+
yield from self._st.iter_keys()
541556

542-
>>> a 1
543-
>>> b 2
544-
>>> x 3
557+
@cython.binding(True)
558+
def __reversed__(self):
545559
"""
546-
cdef str k
547-
cdef object v
548-
for k, v in self._st.iter_items():
549-
yield k, self._unraw(v)
560+
Overview:
561+
Get the reversed iterator of tree value.
562+
563+
:return: A reversed iterator for the keys.
564+
565+
Examples:
566+
>>> from treevalue import TreeValue
567+
>>>
568+
>>> t = TreeValue({'a': 1, 'b': 2, 'x': 3})
569+
>>> for key in reversed(t):
570+
... print(key)
571+
x
572+
b
573+
a
574+
575+
.. note::
576+
Only available in python 3.8 or higher version.
577+
"""
578+
if _reversible:
579+
return self._st.iter_rev_keys()
580+
else:
581+
raise TypeError(f'{self._type.__name__!r} object is not reversible')
550582

551583
@cython.binding(True)
552584
def __len__(self):
@@ -810,13 +842,6 @@ cdef object _build_tree(TreeStorage st, object type_, str prefix, dict id_pool,
810842
self_repr = _prefix_fix(self_repr, prefix)
811843
return self_repr, children
812844

813-
try:
814-
reversed({'a': 1}.keys())
815-
except TypeError:
816-
_reversible = False
817-
else:
818-
_reversible = True
819-
820845
# noinspection PyPep8Naming
821846
cdef class treevalue_keys(_CObject, Sized, Container, Reversible):
822847
def __cinit__(self, TreeStorage storage, type _type):

0 commit comments

Comments
 (0)