You could create and open the `ZipFile` instance directly in `__enter__`, so that you can write directly to the zip file here.
By doing that you would eliminate the `self.file_tuples` list.
If someone then passes in a `StringIO` instance (which means everything is in the RAM), you would directly consume it before processing another file. This would keep the memory footprint low :wink: 

The `generate` method then checks that the `ZipGenerator` context manager is exited (its `__exit__` should exit the `ZipFile` context manager too, meaning the zip is read), and then simply return the stream to the zip (`tmp_file_zip`).

Not sure if I could explain my thoughts in an understandable way - we could also discuss this with a :coffee: :wink: