On Wed, 16 Jul 2014 18:44:38 +1000, Chris Angelico wrote: > On Wed, Jul 16, 2014 at 5:49 PM, Steven D'Aprano <st...@pearwood.info> > wrote: >> ... Although I'm open to the suggestion that maybe the Pythonic way to >> do that should be: >> >> print("foo bar baz", file="foo.txt") >> >> > And I would argue against that suggestion, having worked with a language > where that's the case. [...]
> 1) Hidden global state. Somewhere there's a mapping of file names to > open file handles, and it's not obvious. Absolutely not! What do you take me for, the designer of REXX??? :-P What I had in mind was for print to open the file in append mode, write, then close the file. Something like this: def print(*values, sep=' ', end='\n', file=sys.stdout, flush=False): def write(f): for value in values: f.write(str(value) + sep) f.write(end) if flush: f.flush() if isinstance(file, (str, bytes)): with open(file, 'a') as f: write(f) else: write(f) The downside of this is that it doesn't handle encodings and error handlers, or any of the other, more obscure, arguments to open(). But since print is intended as a convenience function, I'm okay with that. If you need more than the default settings, you should open the file yourself: f = open('something.txt', 'w', encoding='UTF=32') print("fe fi fo fum", file=f) > 2) Corollary: Surprising > behaviour if you try to use a file twice in one program. Not with my idea. The only surprises are if you try to use it with the filename from different threads, but that's a relatively advanced thing to do. If you're using print from two threads at once, don't pass a file name. > 3) Closing a file is sometimes unobvious. If you terminate the program > with open files, there's no problem, but if the program keeps running, > its files stay open. > 4) Very VERY occasionally, you might run into a problem with too many > open files. (It should be noted that I learned REXX back in the 90s. > It's entirely possible that "too many open files" would be at some > insanely ridiculous number now.) At that point, you need to close > something... but how can you know? Neither of these will be a problem. Well, technically, if you opened like a million threads, and had every thread try to print to a different file name at the same time, that could be a problem. But if you're doing that, you deserve whatever happens. ;-) -- Steven -- https://mail.python.org/mailman/listinfo/python-list