我有一个类,它有一个方法可以将数据加载到附加的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
答案 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以接受流,则可能值得考虑。您必须调整类型检查