diff --git a/pynecone/utils/types.py b/pynecone/utils/types.py index a8428c642..888d85122 100644 --- a/pynecone/utils/types.py +++ b/pynecone/utils/types.py @@ -3,6 +3,7 @@ from __future__ import annotations import contextlib +import typing from typing import Any, Callable, Tuple, Type, Union, _GenericAlias # type: ignore from pynecone.base import Base @@ -135,6 +136,8 @@ def is_dataframe(value: Type) -> bool: Returns: Whether the value is a dataframe. """ + if is_generic_alias(value) or value == typing.Any: + return False return value.__name__ == "DataFrame" diff --git a/tests/test_utils.py b/tests/test_utils.py index 423941b4a..0114c1728 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -1,3 +1,4 @@ +import typing from typing import Any, List, Union import pytest @@ -357,3 +358,30 @@ def test_format_ref(name, expected): expected: The expected formatted name. """ assert format.format_ref(name) == expected + + +class DataFrame: + """A Fake pandas DataFrame class.""" + + pass + + +@pytest.mark.parametrize( + "class_type,expected", + [ + (list, False), + (int, False), + (dict, False), + (DataFrame, True), + (typing.Any, False), + (typing.List, False), + ], +) +def test_is_dataframe(class_type, expected): + """Test that a type name is DataFrame. + + Args: + class_type: the class type. + expected: whether type name is DataFrame + """ + assert types.is_dataframe(class_type) == expected