From ea522526a4059afd52d763982c052159b98bf9f8 Mon Sep 17 00:00:00 2001 From: Mike Flowers Date: Thu, 29 May 2025 09:41:59 +0100 Subject: [PATCH 1/4] Improve types for pd.options.display.* properties --- pandas-stubs/_config/config.pyi | 20 ++++----- tests/test_config.py | 76 +++++++++++++++++++++++++++++++++ 2 files changed, 86 insertions(+), 10 deletions(-) diff --git a/pandas-stubs/_config/config.pyi b/pandas-stubs/_config/config.pyi index c4260bdc1..0af7b5228 100644 --- a/pandas-stubs/_config/config.pyi +++ b/pandas-stubs/_config/config.pyi @@ -49,30 +49,30 @@ class DisplayUnicode(DictWrapper): class Display(DictWrapper): chop_threshold: int | None - colheader_justify: str + colheader_justify: Literal["left", "right"] date_dayfirst: bool date_yearfirst: bool encoding: str expand_frame_repr: bool float_format: Callable[[float], str] | None html: DisplayHTML - large_repr: str + large_repr: Literal["truncate", "info"] latex: DisplayLaTeX max_categories: int - max_columns: int - max_colwidth: int - max_dir_items: int + max_columns: int | None + max_colwidth: int | None + max_dir_items: int | None max_info_columns: int max_info_rows: int - max_rows: int - max_seq_items: int - memory_usage: bool - min_rows: int + max_rows: int | None + max_seq_items: int | None + memory_usage: bool | Literal["deep"] | None + min_rows: int | None multi_sparse: bool notebook_repr_html: bool pprint_nest_depth: int precision: int - show_dimensions: str + show_dimensions: bool | Literal["truncate"] unicode: DisplayUnicode width: int diff --git a/tests/test_config.py b/tests/test_config.py index 41ac38914..298be8f7a 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -2,6 +2,7 @@ TYPE_CHECKING, Any, Callable, + Literal, Optional, ) @@ -48,3 +49,78 @@ def test_display_float_format(): formatter = "{,.2f}".format with pd.option_context("display.float_format", formatter): assert pd.get_option("display.float_format") == formatter + + +def test_display_types_none_allowed(): + # GH 1230 + # Initial values + assert_type(pd.options.display.max_columns, Optional[int]) + assert_type(pd.options.display.max_colwidth, Optional[int]) + assert_type(pd.options.display.max_dir_items, Optional[int]) + assert_type(pd.options.display.max_rows, Optional[int]) + assert_type(pd.options.display.max_seq_items, Optional[int]) + assert_type(pd.options.display.min_rows, Optional[int]) + # Test with None + pd.options.display.max_columns = None + check(assert_type(pd.options.display.max_columns, None), type(None)) + pd.options.display.max_colwidth = None + check(assert_type(pd.options.display.max_colwidth, None), type(None)) + pd.options.display.max_dir_items = None + check(assert_type(pd.options.display.max_dir_items, None), type(None)) + pd.options.display.max_rows = None + check(assert_type(pd.options.display.max_rows, None), type(None)) + pd.options.display.max_seq_items = None + check(assert_type(pd.options.display.max_seq_items, None), type(None)) + pd.options.display.min_rows = None + check(assert_type(pd.options.display.min_rows, None), type(None)) + # Test with integer values + pd.options.display.max_columns = 100 + check(assert_type(pd.options.display.max_columns, int), int) + pd.options.display.max_colwidth = 100 + check(assert_type(pd.options.display.max_colwidth, int), int) + pd.options.display.max_dir_items = 100 + check(assert_type(pd.options.display.max_dir_items, int), int) + pd.options.display.max_rows = 100 + check(assert_type(pd.options.display.max_rows, int), int) + pd.options.display.max_seq_items = 100 + check(assert_type(pd.options.display.max_seq_items, int), int) + pd.options.display.min_rows = 100 + check(assert_type(pd.options.display.min_rows, int), int) + + +def test_display_types_literal_constraints(): + # GH 1230 + # Various display options have specific allowed values + # Test colheader_justify with allowed values + assert_type(pd.options.display.colheader_justify, Literal["left", "right"]) + pd.options.display.colheader_justify = "left" + check(assert_type(pd.options.display.colheader_justify, Literal["left"]), str) + pd.options.display.colheader_justify = "right" + check(assert_type(pd.options.display.colheader_justify, Literal["right"]), str) + + # Test large_repr with allowed values + assert_type(pd.options.display.large_repr, Literal["truncate", "info"]) + pd.options.display.large_repr = "truncate" + check(assert_type(pd.options.display.large_repr, Literal["truncate"]), str) + pd.options.display.large_repr = "info" + check(assert_type(pd.options.display.large_repr, Literal["info"]), str) + + # Test memory_usage with allowed values + assert_type(pd.options.display.memory_usage, Optional[Literal[True, False, "deep"]]) + pd.options.display.memory_usage = True + check(assert_type(pd.options.display.memory_usage, Literal[True]), bool) + pd.options.display.memory_usage = False + check(assert_type(pd.options.display.memory_usage, Literal[False]), bool) + pd.options.display.memory_usage = "deep" + check(assert_type(pd.options.display.memory_usage, Literal["deep"]), str) + pd.options.display.memory_usage = None + check(assert_type(pd.options.display.memory_usage, None), type(None)) + + # Test show_dimensions with allowed values + assert_type(pd.options.display.show_dimensions, Literal[True, False, "truncate"]) + pd.options.display.show_dimensions = True + check(assert_type(pd.options.display.show_dimensions, Literal[True]), bool) + pd.options.display.show_dimensions = False + check(assert_type(pd.options.display.show_dimensions, Literal[False]), bool) + pd.options.display.show_dimensions = "truncate" + check(assert_type(pd.options.display.show_dimensions, Literal["truncate"]), str) From f341d04bbaf2252f3076148d2f09342562a3bdef Mon Sep 17 00:00:00 2001 From: mike-flowers-airbnb <88063833+mike-flowers-airbnb@users.noreply.github.com> Date: Fri, 30 May 2025 10:59:27 +0100 Subject: [PATCH 2/4] chop_threshold is float Co-authored-by: Loic Diridollou --- pandas-stubs/_config/config.pyi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas-stubs/_config/config.pyi b/pandas-stubs/_config/config.pyi index 0af7b5228..3e6eb98f6 100644 --- a/pandas-stubs/_config/config.pyi +++ b/pandas-stubs/_config/config.pyi @@ -48,7 +48,7 @@ class DisplayUnicode(DictWrapper): east_asian_width: bool class Display(DictWrapper): - chop_threshold: int | None + chop_threshold: float | None colheader_justify: Literal["left", "right"] date_dayfirst: bool date_yearfirst: bool From c92510f8d8ee152d59ffaa03864cc9eed4054fab Mon Sep 17 00:00:00 2001 From: Mike Flowers Date: Fri, 30 May 2025 11:04:42 +0100 Subject: [PATCH 3/4] PR Feedback --- tests/test_config.py | 34 ++++++++++++++-------------------- 1 file changed, 14 insertions(+), 20 deletions(-) diff --git a/tests/test_config.py b/tests/test_config.py index 298be8f7a..c72a2335d 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -51,41 +51,35 @@ def test_display_float_format(): assert pd.get_option("display.float_format") == formatter -def test_display_types_none_allowed(): +def test_display_types_none_allowed_get_options(): # GH 1230 # Initial values + assert_type(pd.options.display.chop_threshold, Optional[float]) assert_type(pd.options.display.max_columns, Optional[int]) assert_type(pd.options.display.max_colwidth, Optional[int]) assert_type(pd.options.display.max_dir_items, Optional[int]) assert_type(pd.options.display.max_rows, Optional[int]) assert_type(pd.options.display.max_seq_items, Optional[int]) assert_type(pd.options.display.min_rows, Optional[int]) - # Test with None + + +def test_display_types_none_allowed_set_options(): + # GH 1230 + # Test setting each option as None and then to a specific value + pd.options.display.chop_threshold = None + pd.options.display.chop_threshold = 0.9 pd.options.display.max_columns = None - check(assert_type(pd.options.display.max_columns, None), type(None)) - pd.options.display.max_colwidth = None - check(assert_type(pd.options.display.max_colwidth, None), type(None)) - pd.options.display.max_dir_items = None - check(assert_type(pd.options.display.max_dir_items, None), type(None)) - pd.options.display.max_rows = None - check(assert_type(pd.options.display.max_rows, None), type(None)) - pd.options.display.max_seq_items = None - check(assert_type(pd.options.display.max_seq_items, None), type(None)) - pd.options.display.min_rows = None - check(assert_type(pd.options.display.min_rows, None), type(None)) - # Test with integer values pd.options.display.max_columns = 100 - check(assert_type(pd.options.display.max_columns, int), int) + pd.options.display.max_colwidth = None pd.options.display.max_colwidth = 100 - check(assert_type(pd.options.display.max_colwidth, int), int) + pd.options.display.max_dir_items = None pd.options.display.max_dir_items = 100 - check(assert_type(pd.options.display.max_dir_items, int), int) + pd.options.display.max_rows = None pd.options.display.max_rows = 100 - check(assert_type(pd.options.display.max_rows, int), int) + pd.options.display.max_seq_items = None pd.options.display.max_seq_items = 100 - check(assert_type(pd.options.display.max_seq_items, int), int) + pd.options.display.min_rows = None pd.options.display.min_rows = 100 - check(assert_type(pd.options.display.min_rows, int), int) def test_display_types_literal_constraints(): From 3c7a2abba2b2d6a0918c494fa1da56178b6b8439 Mon Sep 17 00:00:00 2001 From: Mike Flowers Date: Sat, 31 May 2025 14:05:09 +0100 Subject: [PATCH 4/4] PR feedback --- tests/test_config.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/tests/test_config.py b/tests/test_config.py index c72a2335d..a8f5dbe4a 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -54,13 +54,13 @@ def test_display_float_format(): def test_display_types_none_allowed_get_options(): # GH 1230 # Initial values - assert_type(pd.options.display.chop_threshold, Optional[float]) - assert_type(pd.options.display.max_columns, Optional[int]) - assert_type(pd.options.display.max_colwidth, Optional[int]) - assert_type(pd.options.display.max_dir_items, Optional[int]) - assert_type(pd.options.display.max_rows, Optional[int]) - assert_type(pd.options.display.max_seq_items, Optional[int]) - assert_type(pd.options.display.min_rows, Optional[int]) + check(assert_type(pd.options.display.chop_threshold, Optional[float]), type(None)) + check(assert_type(pd.options.display.max_columns, Optional[int]), int) + check(assert_type(pd.options.display.max_colwidth, Optional[int]), int) + check(assert_type(pd.options.display.max_dir_items, Optional[int]), int) + check(assert_type(pd.options.display.max_rows, Optional[int]), int) + check(assert_type(pd.options.display.max_seq_items, Optional[int]), int) + check(assert_type(pd.options.display.min_rows, Optional[int]), int) def test_display_types_none_allowed_set_options():