parameters: (
          self, addrs: typing.Union[int, range]
      )
return_statement: return itertools.chain.from_iterable(
              m.data_blocks_at(addrs) for m in self.modules
          )
docstring: Finds all the data blocks that begin at an address or range of
          addresses.
  
          :param addrs: Either a ``range`` object or a single address.
docstring_summary: Finds all the data blocks that begin at an address or range of
          addresses.
docstring_tokens: Finds all the data blocks that begin at an address or range of addresses .
function: def data_blocks_at(
          self, addrs: typing.Union[int, range]
      ) -> typing.Iterable[DataBlock]:
          """Finds all the data blocks that begin at an address or range of
          addresses.
  
          :param addrs: Either a ``range`` object or a single address.
          """
  
          return itertools.chain.from_iterable(
              m.data_blocks_at(addrs) for m in self.modules
          )
function_tokens: def data_blocks_at ( self , addrs : typing . Union [ int , range ] ) -> typing . Iterable [ DataBlock ] : return itertools . chain . from_iterable ( m . data_blocks_at ( addrs ) for m in self . modules )