我正在编写一个函数,需要确定传递给它的对象是否是输入器(可以使用
isinstance(obj,
_BaseImputer
)
进行检查)、缩放器或其他东西。
虽然所有输入器都有一个共同的基类将它们标识为输入器,但缩放器却没有。我发现
sklearn.preprocessing._data
中的所有缩放器都继承了 (OneToOneFeatureMixin, TransformerMixin, BaseEstimator)
,所以我可以检查它们是否是所有缩放器的实例。然而,这可能会产生误报(不确定哪个其他对象可能继承相同的基类)。它也感觉不太干净或Pythonic。
我还想检查该对象是否具有
.inverse_transform()
方法。然而,不仅缩放器具有这一点,SimpleImputer(也许还有其他对象)也具有。
如何轻松检查我的对象是否是缩放器?
不幸的是,最干净的方法是单独检查每个缩放器类型,任何其他检查也可能让非缩放器对象通过。尽管如此,我也会提供一些“黑客工作”。
最安全的解决方案是导入缩放器,然后检查您的对象是否是这些缩放器中的任何一个。
from sklearn.preprocessing import MinMaxScaler, RobustScaler # ... other scalers your code base uses
SCALER_TYPES = [MinMaxScaler, RobustScaler] # Extend list if needed
if any([isinstance(YourObject, scaler_type) for scaler_type in SCALER_TYPES]):
# Do something
pass
else:
# Do something else
pass
现在,如果您想要捕获所有这些内容而不列出您在代码中使用的所有缩放器,则可以依赖缩放器对象的私有属性。不过,它们是私有的,这是有充分理由的,而且即使在补丁版本之间,也可能会在没有通知的情况下进行更改,因此,如果您将 sklearn 更新到新版本,根本无法保证您的代码能够正常工作。您可以依靠对象的字符串表示形式 (
__repr__
) 来检查它是否包含 Scaler
。您可以这样做:
if 'Scaler' in str(YourObject):
# Do something
pass
else:
# Do something else
pass
或
if 'Scaler' in YourObject.__repr__():
# Do something
pass
else:
# Do something else
pass
这将允许任何在字符串表示中具有
Scaler
的内容通过,因此您最好明确并定义缩放器列表。