docs: def find(self, search_str, by='name', language='en'):
          '''Select values by attribute
  
          Args:
  
              searchstr(str): the string to search for
              by(str): the name of the attribute to search by, defaults to 'name'
                  The specified attribute must be either a string
                  or a dict mapping language codes to strings.
                  Such attributes occur, e.g. in :class:`pandasdmx.model.NameableArtefact` which is
                  a base class for :class:`pandasdmx.model.DataFlowDefinition` and many others.
              language(str): language code specifying the language of the text to be searched, defaults to 'en'
  
          Returns:
              DictLike: items where value.<by> contains the search_str. International strings
                  stored as dict with language codes as keys are
                  searched. Capitalization is ignored.
  
          '''
  
          s = search_str.lower()
          # We distinguish between international strings stored as dict such as
          # name.en, name.fr, and normal strings.
          if by in ['name', 'description']:
              get_field = lambda obj: getattr(obj, by)[language]
          else:  # normal string
              get_field = lambda obj: getattr(obj, by)
          return DictLike(result for result in self.items()
                          if s in get_field(result[1]).lower())