Steven D'Aprano <[EMAIL PROTECTED]> wrote: ... > What do people think about functions that accept either a file name or a > file object? > > def handle_file(obj): > if type(obj) == str: > need_to_close = True > obj = file(obj, 'r') > else: > need_to_close = False > do_something_with(obj.read()) > if need_to_close: > data.close() > > Good idea? Bad idea? Just a matter of personal preference?
Acceptable as an idea, but a disaster in terms of this specific implementation (as coded, it would reject a Unicode string, or any other string-like object, for example). Also, if all you're going to do with the file is .read() it in one big gulp, there's no real advantage to this approach, either. Assuming the way you're going to use the file-like object is subtler (e.g., loop line by line so that huge files can be processed without overwhelming memory), then a better implementation may be warranted: def handle_file(file_or_path): try: f = open(file_or_path) finis = f.close except TypeError: f = file_or_path def finis(): pass try: for line in f: ... finally: finis() This version accepts anything that open is happy with, or else any sequence of lines, including but not limited to a file or file-like object open for reading. Now this, it seems to me, is a helpful approach to polymorphism. Alex -- http://mail.python.org/mailman/listinfo/python-list