我想要一个将数据写入文件的函数:
def data_writer(data, file_name):
spiffy_data = data # ...
with open(file_name, 'w') as out:
out.write(spiffy_data)
但有时,我有一个文件对象而不是文件名。在这种情况下,我有时会有一个tempfile.TemporaryFile
(它创建一个可写的文件对象)。
我希望能够写出类似的内容:
def data_writer(data, file_thing):
spiffy_data = data # ...
if type(file_thing) is file_like:
file_thing.write(spiffy_data)
else:
with open(file_name, 'w') as out:
out.write(spiffy_data)
这样做的好方法是什么?
另外,在Python中有意义吗?
答案 0 :(得分:3)
一个函数应该做一件事,并做好一件事。在data_writer
的情况下,一件事是将数据写入类文件对象。让调用者担心提供这样的对象。也就是说,您还可以以包装器的形式提供该调用者,该包装器接收文件名并为data_writer
打开它。
def data_writer(data, file_obj):
spiffy_data = data # ...
file_obj.write(spiffy_data)
def write_data_to_file(data, file_name):
with open(file_name, "w") as f:
data_writer(f, file_name)
答案 1 :(得分:0)
虽然你的方法是LBYL
,但假设它是EAFP
是pythonic。所以你可以try
到
write()
到您收到的file_thing
或open()
它和except
潜在的异常,具体取决于您认为哪个代表默认情况。
编辑: Cf ShadowRanger's comment,为什么将异常处理与上下文管理器混合在一起相当不优雅。