您如何检查 Python csv.writer 实例的 class?

How do you check the class of a Python csv.writer instance?

我有一个函数可以将 python 列表写入各种格式。 csv 是我想写成的格式之一。我知道我使用内置的 csv Python 模块,但我的函数目前是按以下方式编写的:

def foo(self, save_to=None):
    if save_to is None:
        print self.my_list

我可以通过以下方式检查 csv.writer 对象的类型:

writer = csv.writer(open('test.csv','w'))
writer
<_csv.writer at 0x7f278125aca8>    

type(writer)
_csv.writer

如果 save_to 是一个 csv 对象,我如何检查我的函数?通常我会在这样的函数中使用 isinstance

def foo(self, save_to=None):
    if save_to is None:
        print self.my_list
    if isinstance(save_to, _csv.writer):
        save_to.writerow([self.my_list])

但我得到了 NameErrorAttrubuteError

In [28]: isinstance(writer, _csv.writer)
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-28-0af1f54bd092> in <module>()
----> 1 isinstance(writer, _csv.writer)    

NameError: name '_csv' is not defined    

In [29]: isinstance(writer, csv._csv.writer)
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-29-4e8e62254caf> in <module>()
----> 1 isinstance(writer, csv._csv.writer)    

AttributeError: 'module' object has no attribute '_csv

你不应该在这里使用 isinstance 检查(尤其不要在像 _csv 这样的私有模块中使用 class):isinstance 调用违反了 OOP一般的。更具体到 Python,它的 "duck-typing" 意味着你应该尝试使用方法并捕获属性错误:如果它像鸭子一样嘎嘎叫,它就是一只鸭子——如果它实现了 writerow like a csv writer,就是csv writer

try:
    save_to.writerow([self.my_list])
except AttributeError:
    # not a csv writer, do something else

更具体地说,您收到您详细说明的错误的原因是子模块未导入。