[英]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.