繁体   English   中英

在python中正确使用isinstance

[英]Proper use of isinstance in python

我有一个类,带有将数据加载到附加的熊猫数据框中的方法。 我希望我的方法是多态的,所以我对数据进行了两次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

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

在Python中,我们通常更喜欢“鸭子打字”。 与其检查对象是否是特定类的实例,不如检查它是否具有所需的方法。 在您的特定情况下,使用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_toFrame和excel_toFrame以接受流,则可能值得考虑。 您将不得不调整类型检查

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM