On 25 Nov 2021, at 13:07, Eyal Gruss <eyalgruss@gmail.com> wrote:
hi
first post here :) i have a recurring use pattern where i want to save to file everything i print to the screen. i have used the standard logging module and found it too cumbersome for my simple use case, and i find myself changing all my print()'s to custom myprint()'s. i am interested in suggesting several additions to the standard libraries, as i feel this use case is common enough, important enough, and currently painful enough to justify such changes, and that all four of the following suggestions could be useful in a complementary fashion.
1. allow the print() "file" argument to take a list of streams (currently it can take only a single stream). e.g:
with open('output.txt', 'w') as f: print('hello', file=[sys.stdout, f])
You can replace sys.stdout with your own object that prints to a list of streams. I have used this in the past. The implementation can be as simple as supplying an object with a write method that writes to each of the steams I turn. Barry
this seems like the quickest and least resistant path for the user. need to decide how multiple streams will work with the flush argument.
2. modify contextlib.redirect_stdout() to take an additional boolean argument which we can call tee/replicate/duplicate/clone etc. when True it will duplicate instead of just redirecting:
with open('output.txt', 'w') as f: with redirect_stdout(f, tee=True): # will duplicate instead of redirecting print('hello')
or we could add a new context manager contextlib.copy_stdout()
3. allow the contextlib.redirect_stdout() "new_target" argument to take a list of streams, or allow specifying multiple arguments for multiple streams. e.g:
with open('output.txt', 'w') as f: with redirect_stdout(sys.stdout, f): # or redirect_stdout([sys.stdout, f]) print('hello')
this has the benefit over the tee argument of allowing more than one additional stream, but you need to explicitly specify stdout. so would be nice to have both modifications.
4. add to the standard io library a new class which gives you the write interface of a single stream, but is a wrapper that will write to multiple streams:
with open('output.txt', 'w') as f: multi = io.OutputStreamCollection(sys.stdout, f) multi.write('hello\n') # or: print('hello', file=multi)
this is similar to: https://stackoverflow.com/questions/9130755/wrapper-to-write-to-multiple-str..., and we need to decide about the rest of the stream methods.
eyal. _______________________________________________ Python-ideas mailing list -- python-ideas@python.org To unsubscribe send an email to python-ideas-leave@python.org https://mail.python.org/mailman3/lists/python-ideas.python.org/ Message archived at https://mail.python.org/archives/list/python-ideas@python.org/message/7I55RD... Code of Conduct: http://python.org/psf/codeofconduct/