在python中正确使用isinstance

2024-05-29 02:42:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个类,其方法是将数据加载到附加的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

Tags: csv数据方法selfpandasdfdataif
1条回答
网友
1楼 · 发布于 2024-05-29 02:42:35

原则上使用isinstance没有什么错,有时它是唯一的解决方案。我认为你有一个很好的例子来说明这是更好的选择。在

在Python中,我们通常更喜欢“duck-typing”,而不是检查一个对象是否是某个特定类的实例,而是检查它是否具有我们需要的方法。在您的特定情况下,使用isinstance和duck类型似乎没有太大区别。在

鸭子类型的代码可能看起来像:

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\utoframe和excel\utoframe以接受流,则可能值得考虑。你得调整一下你的打字检查

相关问题 更多 >

    热门问题