From 92d483e04c86c36d4dc26f3279374d71994167c2 Mon Sep 17 00:00:00 2001 From: Shruti Sachan Date: Sat, 16 Aug 2025 19:29:39 +0530 Subject: [PATCH 1/4] DOC: Clarify that is_scalar treats Enum members as scalars - Updated docstring to explain exclusion rule clearly - Added Enum example to documentation The docstring now clearly states that anything except list, tuple, numpy.ndarray, and pandas Series is treated as scalar, including Enum members. Fixes #62063 --- pandas/_libs/lib.pyx | 49 ++++++++++++++++++++++++++++---------------- 1 file changed, 31 insertions(+), 18 deletions(-) diff --git a/pandas/_libs/lib.pyx b/pandas/_libs/lib.pyx index 83a1b09f00a11..9089220f7aa93 100644 --- a/pandas/_libs/lib.pyx +++ b/pandas/_libs/lib.pyx @@ -158,28 +158,34 @@ def is_scalar(val: object) -> bool: """ Return True if given object is scalar. + This function considers any object as scalar EXCEPT: + + - list + - tuple + - numpy.ndarray + - pandas Series + + All other objects are treated as scalar, including: + + - Python builtin numerics (int, float, complex) + - Python builtin strings and byte arrays + - None + - datetime objects (datetime, timedelta, date, time) + - numpy scalar types (np.int64, np.float32, etc.) + - pandas types (Period, Timedelta, Timestamp, Interval, DateOffset) + - decimal.Decimal, fractions.Fraction + - Enum members + - Custom objects and other types + Parameters ---------- val : object - This includes: - - - numpy array scalar (e.g. np.int64) - - Python builtin numerics - - Python builtin byte arrays and strings - - None - - datetime.datetime - - datetime.timedelta - - Period - - decimal.Decimal - - Interval - - DateOffset - - Fraction - - Number. + Object to check for scalar properties. Returns ------- bool - Return True if given object is scalar. + True if given object is scalar, False otherwise. See Also -------- @@ -191,10 +197,18 @@ def is_scalar(val: object) -> bool: Examples -------- >>> import datetime + >>> from enum import Enum, auto + >>> >>> dt = datetime.datetime(2018, 10, 3) >>> pd.api.types.is_scalar(dt) True + >>> class Status(Enum): + ... ACTIVE = auto() + ... INACTIVE = auto() + >>> pd.api.types.is_scalar(Status.ACTIVE) + True + >>> pd.api.types.is_scalar([2, 3]) False @@ -234,9 +248,8 @@ def is_scalar(val: object) -> bool: return (PyNumber_Check(val) or is_period_object(val) or isinstance(val, Interval) - or is_offset_object(val)) - - + or is_offset_object(val) + or isinstance(val, Enum)) cdef int64_t get_itemsize(object val): """ Get the itemsize of a NumPy scalar, -1 if not a NumPy scalar. From 9b50a32dd8ee9574827e196446eb72d6854aec0f Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sat, 16 Aug 2025 14:12:40 +0000 Subject: [PATCH 2/4] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- pandas/_libs/lib.pyx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/pandas/_libs/lib.pyx b/pandas/_libs/lib.pyx index 9089220f7aa93..febf628e371f4 100644 --- a/pandas/_libs/lib.pyx +++ b/pandas/_libs/lib.pyx @@ -159,16 +159,16 @@ def is_scalar(val: object) -> bool: Return True if given object is scalar. This function considers any object as scalar EXCEPT: - + - list - - tuple + - tuple - numpy.ndarray - pandas Series - + All other objects are treated as scalar, including: - + - Python builtin numerics (int, float, complex) - - Python builtin strings and byte arrays + - Python builtin strings and byte arrays - None - datetime objects (datetime, timedelta, date, time) - numpy scalar types (np.int64, np.float32, etc.) @@ -198,7 +198,7 @@ def is_scalar(val: object) -> bool: -------- >>> import datetime >>> from enum import Enum, auto - >>> + >>> >>> dt = datetime.datetime(2018, 10, 3) >>> pd.api.types.is_scalar(dt) True From 4db6ba3741af8a51c57641b2bd6e2366ddd7efe7 Mon Sep 17 00:00:00 2001 From: Shruti Sachan Date: Sat, 16 Aug 2025 19:59:26 +0530 Subject: [PATCH 3/4] DOC: Clarify that is_scalar treats Enum members as scalar --- pandas/_libs/lib.pyx | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/pandas/_libs/lib.pyx b/pandas/_libs/lib.pyx index 9089220f7aa93..7376c813af24e 100644 --- a/pandas/_libs/lib.pyx +++ b/pandas/_libs/lib.pyx @@ -159,14 +159,11 @@ def is_scalar(val: object) -> bool: Return True if given object is scalar. This function considers any object as scalar EXCEPT: - - list - tuple - numpy.ndarray - pandas Series - - All other objects are treated as scalar, including: - + All other objects are treated as scalar, including: - Python builtin numerics (int, float, complex) - Python builtin strings and byte arrays - None @@ -176,7 +173,6 @@ def is_scalar(val: object) -> bool: - decimal.Decimal, fractions.Fraction - Enum members - Custom objects and other types - Parameters ---------- val : object @@ -202,7 +198,6 @@ def is_scalar(val: object) -> bool: >>> dt = datetime.datetime(2018, 10, 3) >>> pd.api.types.is_scalar(dt) True - >>> class Status(Enum): ... ACTIVE = auto() ... INACTIVE = auto() From 10b2747668a9ce05258ff6ab67acc062acbe903f Mon Sep 17 00:00:00 2001 From: Shruti Sachan Date: Sat, 16 Aug 2025 22:43:07 +0530 Subject: [PATCH 4/4] DOC: Clarify that is_scalar treats Enum members as scalar --- pandas/_libs/lib.pyx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pandas/_libs/lib.pyx b/pandas/_libs/lib.pyx index 0b91c0d10228a..4a00e2cacb790 100644 --- a/pandas/_libs/lib.pyx +++ b/pandas/_libs/lib.pyx @@ -248,6 +248,8 @@ def is_scalar(val: object) -> bool: or isinstance(val, Interval) or is_offset_object(val) or isinstance(val, Enum)) + + cdef int64_t get_itemsize(object val): """ Get the itemsize of a NumPy scalar, -1 if not a NumPy scalar.