Node Resolution¶
- class anytree.resolver.Resolver(pathattr='name', ignorecase=False, relax=False)[source]¶
Resolve
NodeMixin
paths using attribute pathattr.- Keyword Arguments:
- get(node, path)[source]¶
Return instance at path.
An example module tree:
>>> from anytree import Node >>> top = Node("top", parent=None) >>> sub0 = Node("sub0", parent=top) >>> sub0sub0 = Node("sub0sub0", parent=sub0) >>> sub0sub1 = Node("sub0sub1", parent=sub0) >>> sub1 = Node("sub1", parent=top)
A resolver using the name attribute:
>>> resolver = Resolver('name') >>> relaxedresolver = Resolver('name', relax=True) # never generate exceptions
Relative paths:
>>> resolver.get(top, "sub0/sub0sub0") Node('/top/sub0/sub0sub0') >>> resolver.get(sub1, "..") Node('/top') >>> resolver.get(sub1, "../sub0/sub0sub1") Node('/top/sub0/sub0sub1') >>> resolver.get(sub1, ".") Node('/top/sub1') >>> resolver.get(sub1, "") Node('/top/sub1') >>> resolver.get(top, "sub2") Traceback (most recent call last): ... anytree.resolver.ChildResolverError: Node('/top') has no child sub2. Children are: 'sub0', 'sub1'. >>> print(relaxedresolver.get(top, "sub2")) None
Absolute paths:
>>> resolver.get(sub0sub0, "/top") Node('/top') >>> resolver.get(sub0sub0, "/top/sub0") Node('/top/sub0') >>> resolver.get(sub0sub0, "/") Traceback (most recent call last): ... anytree.resolver.ResolverError: root node missing. root is '/top'. >>> print(relaxedresolver.get(sub0sub0, "/")) None >>> resolver.get(sub0sub0, "/bar") Traceback (most recent call last): ... anytree.resolver.ResolverError: unknown root node '/bar'. root is '/top'. >>> print(relaxedresolver.get(sub0sub0, "/bar")) None
Going above the root node raises a
RootResolverError
:>>> resolver.get(top, "..") Traceback (most recent call last): ... anytree.resolver.RootResolverError: Cannot go above root node Node('/top')
Note
Please not that
get()
returned None in exactly that case above, which was a bug until version 1.8.1.Case insensitive matching:
>>> resolver.get(top, '/TOP') Traceback (most recent call last): ... anytree.resolver.ResolverError: unknown root node '/TOP'. root is '/top'.
>>> ignorecaseresolver = Resolver('name', ignorecase=True) >>> ignorecaseresolver.get(top, '/TOp') Node('/top')
- glob(node, path)[source]¶
Return instances at path supporting wildcards.
Behaves identical to
get
, but accepts wildcards and returns a list of found nodes.* matches any characters, except ‘/’.
? matches a single character, except ‘/’.
An example module tree:
>>> from anytree import Node >>> top = Node("top", parent=None) >>> sub0 = Node("sub0", parent=top) >>> sub0sub0 = Node("sub0", parent=sub0) >>> sub0sub1 = Node("sub1", parent=sub0) >>> sub1 = Node("sub1", parent=top) >>> sub1sub0 = Node("sub0", parent=sub1)
A resolver using the name attribute:
>>> resolver = Resolver('name') >>> relaxedresolver = Resolver('name', relax=True) # never generate exceptions
Relative paths:
>>> resolver.glob(top, "sub0/sub?") [Node('/top/sub0/sub0'), Node('/top/sub0/sub1')] >>> resolver.glob(sub1, ".././*") [Node('/top/sub0'), Node('/top/sub1')] >>> resolver.glob(top, "*/*") [Node('/top/sub0/sub0'), Node('/top/sub0/sub1'), Node('/top/sub1/sub0')] >>> resolver.glob(top, "*/sub0") [Node('/top/sub0/sub0'), Node('/top/sub1/sub0')] >>> resolver.glob(top, "sub1/sub1") Traceback (most recent call last): ... anytree.resolver.ChildResolverError: Node('/top/sub1') has no child sub1. Children are: 'sub0'. >>> relaxedresolver.glob(top, "sub1/sub1") []
Non-matching wildcards are no error:
>>> resolver.glob(top, "bar*") [] >>> resolver.glob(top, "sub2") Traceback (most recent call last): ... anytree.resolver.ChildResolverError: Node('/top') has no child sub2. Children are: 'sub0', 'sub1'. >>> relaxedresolver.glob(top, "sub2") []
Absolute paths:
>>> resolver.glob(sub0sub0, "/top/*") [Node('/top/sub0'), Node('/top/sub1')] >>> resolver.glob(sub0sub0, "/") Traceback (most recent call last): ... anytree.resolver.ResolverError: root node missing. root is '/top'. >>> relaxedresolver.glob(sub0sub0, "/") [] >>> resolver.glob(sub0sub0, "/bar") Traceback (most recent call last): ... anytree.resolver.ResolverError: unknown root node '/bar'. root is '/top'.
Going above the root node raises a
RootResolverError
:>>> resolver.glob(top, "..") Traceback (most recent call last): ... anytree.resolver.RootResolverError: Cannot go above root node Node('/top') >>> relaxedresolver.glob(top, "..") []
- exception anytree.resolver.ResolverError(node, child, msg)[source]¶
Resolve Error at node handling child.