code: def find(self, query=None, func=None, labels=None, colors=None, pinned=None, archived=None, trashed=False): # pylint: disable=too-many-arguments
          
          if labels is not None:
              labels = [i.id if isinstance(i, _node.Label) else i for i in labels]
  
          return (node for node in self.all() if
              (query is None or (
                  (isinstance(query, six.string_types) and (query in node.title or query in node.text)) or
                  (isinstance(query, Pattern) and (
                      query.search(node.title) or query.search(node.text)
                  ))
              )) and
              (func is None or func(node)) and \
              (labels is None or \
               (not labels and not node.labels.all()) or \
               (any((node.labels.get(i) is not None for i in labels)))
              ) and \
              (colors is None or node.color in colors) and \
              (pinned is None or node.pinned == pinned) and \
              (archived is None or node.archived == archived) and \
              (trashed is None or node.trashed == trashed)
          )
docs: Find Notes based on the specified criteria.
  
          Args:
              query (Union[_sre.SRE_Pattern, str, None]): A str or regular expression to match against the title and text.
              func (Union[callable, None]): A filter function.
              labels (Union[List[str], None]): A list of label ids or objects to match. An empty list matches notes with no labels.
              colors (Union[List[str], None]): A list of colors to match.
              pinned (Union[bool, None]): Whether to match pinned notes.
              archived (Union[bool, None]): Whether to match archived notes.
              trashed (Union[bool, None]): Whether to match trashed notes.
  
          Return:
              List[gkeepapi.node.TopLevelNode]: Results.