почему isinstance
не возвращает true в приведенном выше примере?
Поскольку df.values.dtype
возвращает тип , а не объект этого типа. Действительно, df.values.dtype
возвращает dtype('float')
, но это , а не a float
объект . Это объект dtype
.
issubdtype
принимает тип d, тип или строку и проверяет, является ли первый тип тем же или подклассом второго типа. Мы можем проверить порядок разрешения метода типа и посмотреть:
>>> df.values.dtype.type.__mro__
(<class 'numpy.float64'>, <class 'numpy.floating'>, <class 'numpy.inexact'>, <class 'numpy.number'>, <class 'numpy.generic'>, <b><class 'float'></b>, <class 'object'>)
, так что тип действительно является подклассом float
. Но это не экземпляр float
. Экземпляр float
- это, например, 0.0
, 3.14
, np.nan
, et c. Если мы проверим тип этих объектов, то получим:
>>> type(0.0)
<class 'float'>
>>> type(3.14)
<class 'float'>
>>> type(np.nan)
<class 'float'>
Тогда как тип для dtype('float')
равен dtype
, а для float
это просто type
:
>>> type(df.values.dtype)
<class 'numpy.dtype'>
>>> type(float)
<class 'type'>
Таким образом, мы можем проверить, что df.values.dtype
является экземпляром dtype
и получить:
>>> isinstance(df.values.dtype, np.dtype)
True