diff --git a/pandas/_libs/lib.pxd b/pandas/_libs/lib.pxd index 12aca9dabe2e7..b3c72c30a74de 100644 --- a/pandas/_libs/lib.pxd +++ b/pandas/_libs/lib.pxd @@ -1 +1 @@ -cdef bint c_is_list_like(object, bint) +cdef bint c_is_list_like(object, bint) except -1 diff --git a/pandas/_libs/lib.pyx b/pandas/_libs/lib.pyx index 5256bdc988995..14efab735fa7d 100644 --- a/pandas/_libs/lib.pyx +++ b/pandas/_libs/lib.pyx @@ -988,7 +988,7 @@ def is_list_like(obj: object, allow_sets: bool = True) -> bool: return c_is_list_like(obj, allow_sets) -cdef inline bint c_is_list_like(object obj, bint allow_sets): +cdef inline bint c_is_list_like(object obj, bint allow_sets) except -1: return ( isinstance(obj, abc.Iterable) # we do not count strings/unicode/bytes as list-like diff --git a/pandas/tests/dtypes/test_inference.py b/pandas/tests/dtypes/test_inference.py index 8b20f9ada8ff7..4c4a5547247fc 100644 --- a/pandas/tests/dtypes/test_inference.py +++ b/pandas/tests/dtypes/test_inference.py @@ -123,6 +123,17 @@ def test_is_list_like_disallow_sets(maybe_list_like): assert inference.is_list_like(obj, allow_sets=False) == expected +def test_is_list_like_recursion(): + # GH 33721 + # interpreter would crash with with SIGABRT + def foo(): + inference.is_list_like([]) + foo() + + with pytest.raises(RecursionError): + foo() + + def test_is_sequence(): is_seq = inference.is_sequence assert is_seq((1, 2))