Skip to content

Commit a8ef470

Browse files
committed
Add type hints to name resolvers
1 parent eed8482 commit a8ef470

File tree

4 files changed

+17
-14
lines changed

4 files changed

+17
-14
lines changed

pandas/core/computation/parsing.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,7 @@ def create_valid_python_identifier(name: str) -> str:
5858
name = "BACKTICK_QUOTED_STRING_" + name
5959

6060
if not name.isidentifier():
61-
raise ValueError(
62-
f"Could not convert '{name}' to a valid Python identifier."
63-
)
61+
raise SyntaxError(f"Could not convert '{name}' to a valid Python identifier.")
6462

6563
return name
6664

@@ -85,7 +83,7 @@ def tokenize_and_clean_column_names(name: Union[str, int]) -> Union[str, int]:
8583
tokenized = tokenize_string(f"`{name}`")
8684
tokval = next(tokenized)[1]
8785
return create_valid_python_identifier(tokval)
88-
except ValueError:
86+
except SyntaxError:
8987
# Rarely, a name cannot be converted to a valid Python identifier.
9088
# So, we just return the name.
9189
# If this name was used in the query string,

pandas/core/frame.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3217,7 +3217,7 @@ def eval(self, expr, inplace=False, **kwargs):
32173217
kwargs["level"] = kwargs.pop("level", 0) + 1
32183218
if resolvers is None:
32193219
index_resolvers = self._get_index_resolvers()
3220-
column_resolvers = self._get_special_character_free_column_resolvers()
3220+
column_resolvers = self._get_cleaned_column_resolvers()
32213221
resolvers = column_resolvers, index_resolvers
32223222
if "target" not in kwargs:
32233223
kwargs["target"] = self

pandas/core/generic.py

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,8 @@
9090
from pandas.io.formats.printing import pprint_thing
9191
from pandas.tseries.frequencies import to_offset
9292

93+
NameResolver = Dict[Union[str, int], ABCSeries]
94+
9395
# goal is to be able to define the docs close to function, while still being
9496
# able to share
9597
_shared_docs: Dict[str, str] = dict()
@@ -455,7 +457,7 @@ def _get_block_manager_axis(cls, axis):
455457
return m - axis
456458
return axis
457459

458-
def _get_axis_resolvers(self, axis):
460+
def _get_axis_resolvers(self, axis: str) -> NameResolver:
459461
# index or columns
460462
axis_index = getattr(self, axis)
461463
d = dict()
@@ -485,16 +487,16 @@ def _get_axis_resolvers(self, axis):
485487
d[axis] = dindex
486488
return d
487489

488-
def _get_index_resolvers(self):
490+
def _get_index_resolvers(self) -> NameResolver:
489491
from pandas.core.computation.parsing import tokenize_and_clean_column_names
490492

491-
d = {}
493+
d: NameResolver = {}
492494
for axis_name in self._AXIS_ORDERS:
493495
d.update(self._get_axis_resolvers(axis_name))
494496

495-
return {tokenize_and_clean_column_names(k) or k: v for k, v in d.items()}
497+
return {tokenize_and_clean_column_names(k): v for k, v in d.items()}
496498

497-
def _get_special_character_free_column_resolvers(self) -> dict:
499+
def _get_cleaned_column_resolvers(self) -> NameResolver:
498500
"""Return the special character free column resolvers of a dataframe.
499501
500502
Column names with special characters are 'cleaned up' so that they can
@@ -503,7 +505,10 @@ def _get_special_character_free_column_resolvers(self) -> dict:
503505
"""
504506
from pandas.core.computation.parsing import tokenize_and_clean_column_names
505507

506-
return {tokenize_and_clean_column_names(k) or k: v for k, v in self.items()}
508+
if isinstance(self, ABCSeries):
509+
return {tokenize_and_clean_column_names(self.name): self}
510+
511+
return {tokenize_and_clean_column_names(k): v for k, v in self.items()}
507512

508513
@property
509514
def _info_axis(self):

pandas/tests/frame/test_query_eval.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1161,13 +1161,13 @@ def test_lots_of_operators_string(self, df):
11611161
tm.assert_frame_equal(res, expect)
11621162

11631163
def test_failing_quote(self, df):
1164-
with pytest.raises(ValueError):
1164+
with pytest.raises(SyntaxError):
11651165
df.query("`it's` > `that's`")
11661166

11671167
def test_failing_character_outside_range(self, df):
1168-
with pytest.raises(ValueError):
1168+
with pytest.raises(SyntaxError):
11691169
df.query("`☺` > 4")
11701170

11711171
def test_failing_hashtag(self, df):
1172-
with pytest.raises(ValueError):
1172+
with pytest.raises(SyntaxError):
11731173
df.query("`foo#bar` > 4")

0 commit comments

Comments
 (0)