--capture feature (written by Misha) replaces
sys.stderr for each test being run, and displays the output only if the test fails.
Leeor Aharon, of ff-activex-host fame, wanted to use it with Python's logging module, but the
StreamHandler class stores a reference to the output stream on initialization - it already has a reference to sys.stdout, so replacing it won't affect it.
We originally thought of sublcassing
StreamHandler and making retrieve the logger from a property, but we came up with this elegant code instead:
class LazyEvaluator(object): def __init__(self, factory): self.__factory = factory def __getattr__(self, name): return getattr(self.__factory(), name) lazy_stdout = LazyEvaluator(lambda:sys.stdout) handler = StreamHandler(strm=lazy_stdout)
The "lazy evaluator" is initialized with a factory callable, and every time it tries to access an attribute or method the object will be re-created by the factory. No changes necessary for
./alltests.py --capture works like a charm.