StringIO
I recently discovered the StringIO
module and have been using it surprisingly often. It’s not a terribly flashy module, being roughly equivalent to a C++ stringstream
, but it is proving useful more than I expected. There are a couple use cases that have come up more than once just in the last couple weeks:
- I’m trying to run a command that produces output to stdout and read that output with a function that expects a file. Instead of piping the command’s output to a file, I can just initialize a
StringIO
with the result ofsubprocess.check_output()
and pass it into the function. Intermediate files suck and I hate them. Using aStringIO
, by contrast, is so fresh and so clean, clean. - I’m trying to write unit tests for functions or methods that read things from files. A unit test that depends on a file isn’t very, you know, unit-y. So instead I can keep it all in the test suite by putting the contents of a test file into a
StringIO
and passing that to the function or method I want to test. Poof, no filthy, error-prone external files sitting around and begriming the purity of my unit tests.
In retrospect, at least the second of these things seems obvious: like it should be a bog-standard way to write unit tests that don’t depend on external resources. But I’ve done a fair amount of cruising StackOverflow and other places looking at Python unit test best practices and haven’t ever stumbled across it before.