Ответ 1
Нечетная вещь о вашем коде состоит в том, что если он передается открытым файлом, он закроет его. Это плохо. Независимо от того, какой код открыт, файл должен нести ответственность за его закрытие. Это делает функцию немного более сложной, хотя:
def awesome_parse(path_or_file):
if isinstance(path_or_file, basestring):
f = file_to_close = open(path_or_file, 'rb')
else:
f = path_or_file
file_to_close = None
try:
return do_stuff(f)
finally:
if file_to_close:
file_to_close.close()
Вы можете абстрагировать это, написав свой собственный менеджер контекстов:
@contextlib.contextmanager
def awesome_open(path_or_file):
if isinstance(path_or_file, basestring):
f = file_to_close = open(path_or_file, 'rb')
else:
f = path_or_file
file_to_close = None
try:
yield f
finally:
if file_to_close:
file_to_close.close()
def awesome_parse(path_or_file):
with awesome_open(path_or_file) as f:
return do_stuff(f)