在python中正确使用isinstance

时间:2015-03-10 20:32:35

标签: python pandas

我有一个类,它有一个方法可以将数据加载到附加的pandas数据帧中。我希望我的方法是多态的,所以我对数据进行了几次isinstance检查。

我之前已经阅读过python检查数据类型可能是不好的做法,但在这种情况下我认为它是相关的。在这种情况下,这是编码的良好做法,还是有更好的方法来考虑这个问题?

def add_data(self, data, **kwargs):
    if isinstance(data, six.string_types):
        if data.lower().endswith('.csv'):
            self.csv_toFrame(data, kwargs)
        elif data.lower().endswith('.xls', '.xlsx'):
            self.excel_toFrame(data, kwargs)

    elif isinstance(data, pd.DataFrame):
        self.data_df = data

    elif isinstance(data, Variable):
        self.data_df = data.var_df

    return

1 个答案:

答案 0 :(得分:4)

原则上使用isinstance并没有错,有时候它是唯一的解决方案。我认为你有一个很好的例子,它是一个更好的选择。

在Python中,我们通常更喜欢"鸭子打字。"我们只是检查它是否具有我们需要的方法,而不是检查对象是否是特定类的实例。在您的具体情况下,使用isinstance和duck typing之间似乎没什么区别。

代码的鸭型版本可能如下所示:

def add_data(self, data, **kwargs):
     try:  
          self.csv_toFrame(data, kwargs)
     except:
            try:
                self.excel_toFrame(data, kwargs)
            except:
                try:
                     self.data_df = data.var_df
                except:             
                     #some check to make sure it's a data-frame
                     self.data_df = data

      return

我认为这比原始代码的可读性低得多。

另一方面,如果您希望数据是文件流,并且修改csv_toFrame和excel_toFrame以接受流,则可能值得考虑。您必须调整类型检查