From c2a415aa411155108234de7977441abd5137fc40 Mon Sep 17 00:00:00 2001 From: jbrockmendel Date: Sat, 14 Mar 2020 19:24:19 -0700 Subject: [PATCH] merge NonConsolidateableMixin into ExtensionArray --- pandas/core/internals/blocks.py | 43 ++++++++----------- pandas/tests/extension/test_external_block.py | 5 ++- 2 files changed, 21 insertions(+), 27 deletions(-) diff --git a/pandas/core/internals/blocks.py b/pandas/core/internals/blocks.py index 1a92a9486e9e4..07707e1b0093c 100644 --- a/pandas/core/internals/blocks.py +++ b/pandas/core/internals/blocks.py @@ -1598,12 +1598,22 @@ def _replace_coerce( return self -class NonConsolidatableMixIn: - """ hold methods for the nonconsolidatable blocks """ +class ExtensionBlock(Block): + """ + Block for holding extension types. + + Notes + ----- + This holds all 3rd-party extension array types. It's also the immediate + parent class for our internal extension types' blocks, CategoricalBlock. + + ExtensionArrays are limited to 1-D. + """ _can_consolidate = False _verify_integrity = False _validate_ndim = False + is_extension = True def __init__(self, values, placement, ndim=None): """ @@ -1614,6 +1624,8 @@ def __init__(self, values, placement, ndim=None): This will call continue to call __init__ for the other base classes mixed in with this Mixin. """ + values = self._maybe_coerce_values(values) + # Placement must be converted to BlockPlacement so that we can check # its length if not isinstance(placement, libinternals.BlockPlacement): @@ -1627,6 +1639,10 @@ def __init__(self, values, placement, ndim=None): ndim = 2 super().__init__(values, placement, ndim=ndim) + if self.ndim == 2 and len(self.mgr_locs) != 1: + # TODO(2DEA): check unnecessary with 2D EAs + raise AssertionError("block.size != values.size") + @property def shape(self): if self.ndim == 1: @@ -1722,29 +1738,6 @@ def _get_unstack_items(self, unstacker, new_columns): mask = mask.any(0) return new_placement, new_values, mask - -class ExtensionBlock(NonConsolidatableMixIn, Block): - """ - Block for holding extension types. - - Notes - ----- - This holds all 3rd-party extension array types. It's also the immediate - parent class for our internal extension types' blocks, CategoricalBlock. - - ExtensionArrays are limited to 1-D. - """ - - is_extension = True - - def __init__(self, values, placement, ndim=None): - values = self._maybe_coerce_values(values) - super().__init__(values, placement, ndim) - - if self.ndim == 2 and len(self.mgr_locs) != 1: - # TODO(2DEA): check unnecessary with 2D EAs - raise AssertionError("block.size != values.size") - def _maybe_coerce_values(self, values): """ Unbox to an extension array. diff --git a/pandas/tests/extension/test_external_block.py b/pandas/tests/extension/test_external_block.py index 8a8dac54cf96a..26606d7e799e8 100644 --- a/pandas/tests/extension/test_external_block.py +++ b/pandas/tests/extension/test_external_block.py @@ -3,12 +3,13 @@ import pandas as pd from pandas.core.internals import BlockManager, SingleBlockManager -from pandas.core.internals.blocks import Block, NonConsolidatableMixIn +from pandas.core.internals.blocks import ExtensionBlock -class CustomBlock(NonConsolidatableMixIn, Block): +class CustomBlock(ExtensionBlock): _holder = np.ndarray + _can_hold_na = False def concat_same_type(self, to_concat, placement=None): """