<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def banner(self, *ids, _expand_macros=None):
 """Get data about banners by their ids. Macros in banners' names and descriptions are not expanded. Parameters *ids : str Banner ids. Returns ------- an :class:`ApiQuery` of a list of :class:`Banner` Raises ------ :class:`NotFound` If any of the provided ids is invalid. """

        async def noop(s):
            return s

        _expand_macros = _expand_macros or noop

        @api_query('banner', banner=','.join(ids))
        async def result(_, root):
            banners = [await Banner(elem, _expand_macros)
                       for elem in root.find('BANNERS')]
            if not len(banners) == len(ids):
                raise NotFound('one of the banner ids provided is invalid')
            return banners
        return result(self)