docs: def list(self, all=False, before=None, filters=None, limit=-1, since=None,
               sparse=False, ignore_removed=False):
          """
          List containers. Similar to the ``docker ps`` command.
  
          Args:
              all (bool): Show all containers. Only running containers are shown
                  by default
              since (str): Show only containers created since Id or Name, include
                  non-running ones
              before (str): Show only container created before Id or Name,
                  include non-running ones
              limit (int): Show `limit` last created containers, include
                  non-running ones
              filters (dict): Filters to be processed on the image list.
                  Available filters:
  
                  - `exited` (int): Only containers with specified exit code
                  - `status` (str): One of ``restarting``, ``running``,
                      ``paused``, ``exited``
                  - `label` (str): format either ``"key"`` or ``"key=value"``
                  - `id` (str): The id of the container.
                  - `name` (str): The name of the container.
                  - `ancestor` (str): Filter by container ancestor. Format of
                      ``<image-name>[:tag]``, ``<image-id>``, or
                      ``<image@digest>``.
                  - `before` (str): Only containers created before a particular
                      container. Give the container name or id.
                  - `since` (str): Only containers created after a particular
                      container. Give container name or id.
  
                  A comprehensive list can be found in the documentation for
                  `docker ps
                  <https://docs.docker.com/engine/reference/commandline/ps>`_.
  
              sparse (bool): Do not inspect containers. Returns partial
                  information, but guaranteed not to block. Use
                  :py:meth:`Container.reload` on resulting objects to retrieve
                  all attributes. Default: ``False``
              ignore_removed (bool): Ignore failures due to missing containers
                  when attempting to inspect containers from the original list.
                  Set to ``True`` if race conditions are likely. Has no effect
                  if ``sparse=True``. Default: ``False``
  
          Returns:
              (list of :py:class:`Container`)
  
          Raises:
              :py:class:`docker.errors.APIError`
                  If the server returns an error.
          """
          resp = self.client.api.containers(all=all, before=before,
                                            filters=filters, limit=limit,
                                            since=since)
          if sparse:
              return [self.prepare_model(r) for r in resp]
          else:
              containers = []
              for r in resp:
                  try:
                      containers.append(self.get(r['Id']))
                  # a container may have been removed while iterating
                  except NotFound:
                      if not ignore_removed:
                          raise
              return containers