如何判断我是否有类似文件的对象?

时间:2016-10-18 14:18:40

标签: python python-3.x

我想要一个将数据写入文件的函数:

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中有意义吗?

2 个答案:

答案 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,为什么将异常处理与上下文管理器混合在一起相当不优雅。