The Houdini lsattrs logic does a search for nodes based on a parameter name and value which is used for host.ls() in Houdini.
I just heard of nodesearch that comes with Houdini out of the box. It might be worth actually relying on that logic instead.
It could make lsattrs basically like this:
# pseudocode match any of {attr: value} in attrs
import hou
import nodesearch
def lsattrs(attrs):
root = hou.node("/obj")
for attr, value in attrs.items():
matcher = nodesearch.RawParm(attr, value, exact=True)
for node in matcher.nodes(root, recursive=True)
yield node
And I noticed the current logic in Houdini doesn't actually ensure all input values of the attrs dict get matched but if we do actually want that:
# pseudocode match all of {attr: value} in attrs
import hou
import nodesearch
def lsattrs(attrs):
root = hou.node("/obj")
matchers = []
for attr, value in attrs.items():
matchers.append(nodesearch.RawParm(attr, value, exact=True))
for node in nodesearch.Group(matchers, intersect=True):
yield node
It could be worth investigating whether the logic used by nodesearch is faster or not.
Additional Context
This could be a micro-optimization so might only really be worth if host.ls() really becomes problematic. But leaving it here for future reference.
What happened?
The Houdini
lsattrs
logic does a search for nodes based on a parameter name and value which is used forhost.ls()
in Houdini.I just heard of
nodesearch
that comes with Houdini out of the box. It might be worth actually relying on that logic instead.It could make
lsattrs
basically like this:And I noticed the current logic in Houdini doesn't actually ensure all input values of the
attrs
dict get matched but if we do actually want that:It could be worth investigating whether the logic used by
nodesearch
is faster or not.Additional Context
This could be a micro-optimization so might only really be worth if
host.ls()
really becomes problematic. But leaving it here for future reference.