Node Resolution

class anytree.resolver.Resolver(pathattr='name', ignorecase=False, relax=False)[source]

Resolve NodeMixin paths using attribute pathattr.

Keyword Arguments:
  • name (str) – Name of the node attribute to be used for resolving

  • ignorecase (bool) – Enable case insensisitve handling.

  • relax (bool) – Do not raise an exception.

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, "..")
[]
static is_wildcard(path)[source]

Return True is a wildcard.

exception anytree.resolver.ResolverError(node, child, msg)[source]

Resolve Error at node handling child.

exception anytree.resolver.RootResolverError(root)[source]

Root Resolve Error, cannot go above root node.

exception anytree.resolver.ChildResolverError(node, child, pathattr)[source]

Child Resolve Error at node handling child.