From 70c89025ff10da9cd7aefb80db4f3aca079b4afe Mon Sep 17 00:00:00 2001 From: Chuanzhu Xu Date: Fri, 21 Jun 2019 16:18:34 -0400 Subject: [PATCH 1/8] add type hint for core/computation/eva --- pandas/core/computation/eval.py | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/pandas/core/computation/eval.py b/pandas/core/computation/eval.py index ef4639a3afe4c..233827d20acf5 100644 --- a/pandas/core/computation/eval.py +++ b/pandas/core/computation/eval.py @@ -5,17 +5,21 @@ """ import tokenize +from typing import Any, Iterable, Union import warnings +import numpy as np + from pandas.util._validators import validate_bool_kwarg +import pandas as pd from pandas.core.computation.engines import _engines from pandas.core.computation.scope import _ensure_scope from pandas.io.formats.printing import pprint_thing -def _check_engine(engine): +def _check_engine(engine: str) -> str: """ Make sure a valid engine is passed. @@ -60,7 +64,7 @@ def _check_engine(engine): return engine -def _check_parser(parser): +def _check_parser(parser: str) -> None: """ Make sure a valid parser is passed. @@ -80,7 +84,7 @@ def _check_parser(parser): ' {valid}'.format(parser=parser, valid=_parsers.keys())) -def _check_resolvers(resolvers): +def _check_resolvers(resolvers: Iterable) -> None: if resolvers is not None: for resolver in resolvers: if not hasattr(resolver, '__getitem__'): @@ -89,7 +93,7 @@ def _check_resolvers(resolvers): 'the __getitem__ method'.format(name=name)) -def _check_expression(expr): +def _check_expression(expr: Any) -> None: """ Make sure an expression is not an empty string @@ -107,7 +111,7 @@ def _check_expression(expr): raise ValueError("expr cannot be an empty string") -def _convert_expression(expr): +def _convert_expression(expr: Any) -> str: """ Convert an object to an expression. @@ -136,7 +140,7 @@ def _convert_expression(expr): return s -def _check_for_locals(expr, stack_level, parser): +def _check_for_locals(expr: Any, stack_level: int, parser: str) -> None: from pandas.core.computation.expr import tokenize_string at_top_of_stack = stack_level == 0 @@ -156,9 +160,16 @@ def _check_for_locals(expr, stack_level, parser): raise SyntaxError(msg) -def eval(expr, parser='pandas', engine=None, truediv=True, - local_dict=None, global_dict=None, resolvers=(), level=0, - target=None, inplace=False): +def eval(expr: str, + parser: str = 'pandas', + engine: str = None, + truediv: bool = True, + local_dict: dict = None, + global_dict: dict = None, + resolvers: Iterable = (), + level: int = 0, + target: Union[np.ndarry, pd.DataFrame, pd.Series] = None, + inplace: bool = False) -> Union[np.ndarry, pd.DataFrame, pd.Series]: """ Evaluate a Python expression as a string using various backends. From 5554ccb0e94fdb5af80b925dac0abca414ac060a Mon Sep 17 00:00:00 2001 From: Chuanzhu Xu Date: Fri, 21 Jun 2019 22:07:55 -0400 Subject: [PATCH 2/8] replace Any by str for expr --- pandas/core/computation/eval.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pandas/core/computation/eval.py b/pandas/core/computation/eval.py index 233827d20acf5..a0bfe71df590e 100644 --- a/pandas/core/computation/eval.py +++ b/pandas/core/computation/eval.py @@ -5,7 +5,7 @@ """ import tokenize -from typing import Any, Iterable, Union +from typing import Iterable, Union import warnings import numpy as np @@ -111,7 +111,7 @@ def _check_expression(expr: Any) -> None: raise ValueError("expr cannot be an empty string") -def _convert_expression(expr: Any) -> str: +def _convert_expression(expr: str) -> str: """ Convert an object to an expression. @@ -140,7 +140,7 @@ def _convert_expression(expr: Any) -> str: return s -def _check_for_locals(expr: Any, stack_level: int, parser: str) -> None: +def _check_for_locals(expr: str, stack_level: int, parser: str) -> None: from pandas.core.computation.expr import tokenize_string at_top_of_stack = stack_level == 0 From 658b245b63687794468ea91f8623fe213faff029 Mon Sep 17 00:00:00 2001 From: Chuanzhu Xu Date: Fri, 21 Jun 2019 22:46:52 -0400 Subject: [PATCH 3/8] update target and return types --- pandas/core/computation/eval.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pandas/core/computation/eval.py b/pandas/core/computation/eval.py index a0bfe71df590e..20d173c3c8520 100644 --- a/pandas/core/computation/eval.py +++ b/pandas/core/computation/eval.py @@ -5,7 +5,7 @@ """ import tokenize -from typing import Iterable, Union +from typing import Dict, Iterable, Union import warnings import numpy as np @@ -93,7 +93,7 @@ def _check_resolvers(resolvers: Iterable) -> None: 'the __getitem__ method'.format(name=name)) -def _check_expression(expr: Any) -> None: +def _check_expression(expr: str) -> None: """ Make sure an expression is not an empty string @@ -168,8 +168,8 @@ def eval(expr: str, global_dict: dict = None, resolvers: Iterable = (), level: int = 0, - target: Union[np.ndarry, pd.DataFrame, pd.Series] = None, - inplace: bool = False) -> Union[np.ndarry, pd.DataFrame, pd.Series]: + target: Union[float, np.ndarray, pd.DataFrame, pd.Series] = None, + inplace: bool = False) -> Union[float, np.ndarray, pd.DataFrame, pd.Series]: """ Evaluate a Python expression as a string using various backends. From 8998a0b161382b0f16465f701c5773ed55a31104 Mon Sep 17 00:00:00 2001 From: Chuanzhu Xu Date: Fri, 21 Jun 2019 22:49:26 -0400 Subject: [PATCH 4/8] linting updated --- pandas/core/computation/eval.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pandas/core/computation/eval.py b/pandas/core/computation/eval.py index 20d173c3c8520..cb0b889208250 100644 --- a/pandas/core/computation/eval.py +++ b/pandas/core/computation/eval.py @@ -5,7 +5,7 @@ """ import tokenize -from typing import Dict, Iterable, Union +from typing import Iterable, Union import warnings import numpy as np @@ -169,7 +169,8 @@ def eval(expr: str, resolvers: Iterable = (), level: int = 0, target: Union[float, np.ndarray, pd.DataFrame, pd.Series] = None, - inplace: bool = False) -> Union[float, np.ndarray, pd.DataFrame, pd.Series]: + inplace: bool = False, + ) -> Union[float, np.ndarray, pd.DataFrame, pd.Series]: """ Evaluate a Python expression as a string using various backends. From f31c616de38863717430da7cb8dbee13b201d7c9 Mon Sep 17 00:00:00 2001 From: Chuanzhu Xu Date: Fri, 21 Jun 2019 23:33:44 -0400 Subject: [PATCH 5/8] update local/global_dict type hint to use generic Dict --- pandas/core/computation/eval.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pandas/core/computation/eval.py b/pandas/core/computation/eval.py index cb0b889208250..2b31d8e2dd302 100644 --- a/pandas/core/computation/eval.py +++ b/pandas/core/computation/eval.py @@ -5,7 +5,7 @@ """ import tokenize -from typing import Iterable, Union +from typing import Any, Dict, Iterable, Union import warnings import numpy as np @@ -164,8 +164,8 @@ def eval(expr: str, parser: str = 'pandas', engine: str = None, truediv: bool = True, - local_dict: dict = None, - global_dict: dict = None, + local_dict: Dict[str, Any] = None, + global_dict: Dict[str, Any] = None, resolvers: Iterable = (), level: int = 0, target: Union[float, np.ndarray, pd.DataFrame, pd.Series] = None, From 0263816116ab71cb15c7934e35b5cd7ae0a04b96 Mon Sep 17 00:00:00 2001 From: Chuanzhu Xu Date: Sun, 23 Jun 2019 22:23:13 -0400 Subject: [PATCH 6/8] update type hint to fix CI --- pandas/core/computation/eval.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/pandas/core/computation/eval.py b/pandas/core/computation/eval.py index 2b31d8e2dd302..ca6f0c9047d34 100644 --- a/pandas/core/computation/eval.py +++ b/pandas/core/computation/eval.py @@ -5,7 +5,7 @@ """ import tokenize -from typing import Any, Dict, Iterable, Union +from typing import Any, Dict, Iterable, List, Optional, Union import warnings import numpy as np @@ -19,7 +19,7 @@ from pandas.io.formats.printing import pprint_thing -def _check_engine(engine: str) -> str: +def _check_engine(engine: Optional[str]) -> str: """ Make sure a valid engine is passed. @@ -158,14 +158,15 @@ def _check_for_locals(expr: str, stack_level: int, parser: str) -> None: for toknum, tokval in tokenize_string(expr): if toknum == tokenize.OP and tokval == '@': raise SyntaxError(msg) + return None def eval(expr: str, parser: str = 'pandas', engine: str = None, truediv: bool = True, - local_dict: Dict[str, Any] = None, - global_dict: Dict[str, Any] = None, + local_dict: List[Dict[str, Any]] = None, + global_dict: List[Dict[str, Any]] = None, resolvers: Iterable = (), level: int = 0, target: Union[float, np.ndarray, pd.DataFrame, pd.Series] = None, From 9b07641f0fe0fa0e1037f5e447111146ebb267a7 Mon Sep 17 00:00:00 2001 From: Chuanzhu Xu Date: Sun, 23 Jun 2019 23:17:40 -0400 Subject: [PATCH 7/8] Add return for inplace is true --- pandas/core/computation/eval.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pandas/core/computation/eval.py b/pandas/core/computation/eval.py index ca6f0c9047d34..f33a26a5294d2 100644 --- a/pandas/core/computation/eval.py +++ b/pandas/core/computation/eval.py @@ -366,3 +366,5 @@ def eval(expr: str, # We want to exclude `inplace=None` as being False. if inplace is False: return target if target_modified else ret + else: + return target From 1e068b45fb0c5318725a534c740a86261d1e53d1 Mon Sep 17 00:00:00 2001 From: Chuanzhu Xu Date: Sun, 23 Jun 2019 23:43:48 -0400 Subject: [PATCH 8/8] update return type for inplace and update type for resolver --- pandas/core/computation/eval.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pandas/core/computation/eval.py b/pandas/core/computation/eval.py index f33a26a5294d2..3764cec43028c 100644 --- a/pandas/core/computation/eval.py +++ b/pandas/core/computation/eval.py @@ -5,7 +5,7 @@ """ import tokenize -from typing import Any, Dict, Iterable, List, Optional, Union +from typing import Any, Dict, Iterable, List, Optional, Tuple, Union import warnings import numpy as np @@ -167,7 +167,7 @@ def eval(expr: str, truediv: bool = True, local_dict: List[Dict[str, Any]] = None, global_dict: List[Dict[str, Any]] = None, - resolvers: Iterable = (), + resolvers: Tuple = (), level: int = 0, target: Union[float, np.ndarray, pd.DataFrame, pd.Series] = None, inplace: bool = False, @@ -367,4 +367,4 @@ def eval(expr: str, if inplace is False: return target if target_modified else ret else: - return target + return None