From 83a0f82b6b3d2fc629f028ff617f813d4aa23f09 Mon Sep 17 00:00:00 2001 From: James Lamb Date: Fri, 3 Mar 2023 23:25:54 -0600 Subject: [PATCH 1/4] [python-package] drop Python 3.6 support, used dataclasses --- python-package/lightgbm/callback.py | 21 +++++++++++---------- python-package/setup.py | 2 +- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/python-package/lightgbm/callback.py b/python-package/lightgbm/callback.py index 330bfd5c76a7..d27b299ecb73 100644 --- a/python-package/lightgbm/callback.py +++ b/python-package/lightgbm/callback.py @@ -1,10 +1,11 @@ # coding: utf-8 """Callbacks library.""" import collections +from dataclasses import dataclass from functools import partial -from typing import Any, Callable, Dict, List, Tuple, Union +from typing import Any, Callable, Dict, List, Optional, Tuple, Union -from .basic import _ConfigAliases, _LGBM_BoosterEvalMethodResultType, _log_info, _log_warning +from .basic import Booster, _ConfigAliases, _LGBM_BoosterEvalMethodResultType, _log_info, _log_warning __all__ = [ 'early_stopping', @@ -39,14 +40,14 @@ def __init__(self, best_iteration: int, best_score: _EvalResultTuple) -> None: # Callback environment used by callbacks -CallbackEnv = collections.namedtuple( - "CallbackEnv", - ["model", - "params", - "iteration", - "begin_iteration", - "end_iteration", - "evaluation_result_list"]) +@dataclass +class CallbackEnv: + model: Booster + params: Dict[str, Any] + iteration: int + begin_iteration: int + end_iteration: int + evaluation_result_list: Optional[List[_LGBM_BoosterEvalMethodResultType]] def _format_eval_result(value: _EvalResultTuple, show_stdv: bool) -> str: diff --git a/python-package/setup.py b/python-package/setup.py index b1620929f816..7ba2850a9ec8 100644 --- a/python-package/setup.py +++ b/python-package/setup.py @@ -349,7 +349,7 @@ def run(self) -> None: description='LightGBM Python Package', long_description=readme, long_description_content_type='text/x-rst', - python_requires='>=3.6', + python_requires='>=3.7', install_requires=[ 'wheel', 'numpy', From aa26cbbcb14e38a90e9ec4c15ee308e4ad24bd8b Mon Sep 17 00:00:00 2001 From: James Lamb Date: Fri, 3 Mar 2023 23:34:38 -0600 Subject: [PATCH 2/4] replace _HostWorkers too --- python-package/lightgbm/dask.py | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/python-package/lightgbm/dask.py b/python-package/lightgbm/dask.py index ba8f234cefec..7427611fea22 100644 --- a/python-package/lightgbm/dask.py +++ b/python-package/lightgbm/dask.py @@ -7,8 +7,9 @@ It is based on dask-lightgbm, which was based on dask-xgboost. """ import socket -from collections import defaultdict, namedtuple +from collections import defaultdict from copy import deepcopy +from dataclasses import dataclass from enum import Enum, auto from functools import partial from typing import Any, Dict, Iterable, List, Optional, Tuple, Type, Union @@ -37,7 +38,11 @@ _DaskPart = Union[np.ndarray, pd_DataFrame, pd_Series, ss.spmatrix] _PredictionDtype = Union[Type[np.float32], Type[np.float64], Type[np.int32], Type[np.int64]] -_HostWorkers = namedtuple('_HostWorkers', ['default', 'all']) + +@dataclass +class _HostWorkers: + default: str + all_workers: str class _DatasetNames(Enum): @@ -105,9 +110,9 @@ def _group_workers_by_host(worker_addresses: Iterable[str]) -> Dict[str, _HostWo if not hostname: raise ValueError(f"Could not parse host name from worker address '{address}'") if hostname not in host_to_workers: - host_to_workers[hostname] = _HostWorkers(default=address, all=[address]) + host_to_workers[hostname] = _HostWorkers(default=address, all_workers=[address]) else: - host_to_workers[hostname].all.append(address) + host_to_workers[hostname].all_workers.append(address) return host_to_workers @@ -124,7 +129,7 @@ def _assign_open_ports_to_workers( """ host_ports_futures = {} for hostname, workers in host_to_workers.items(): - n_workers_in_host = len(workers.all) + n_workers_in_host = len(workers.all_workers) host_ports_futures[hostname] = client.submit( _find_n_open_ports, n=n_workers_in_host, @@ -135,7 +140,7 @@ def _assign_open_ports_to_workers( found_ports = client.gather(host_ports_futures) worker_to_port = {} for hostname, workers in host_to_workers.items(): - for worker, port in zip(workers.all, found_ports[hostname]): + for worker, port in zip(workers.all_workers, found_ports[hostname]): worker_to_port[worker] = port return worker_to_port From 851c35642815ab1a9a66fa1b4a024f06f2314fd7 Mon Sep 17 00:00:00 2001 From: James Lamb Date: Fri, 3 Mar 2023 23:55:31 -0600 Subject: [PATCH 3/4] fix mypy stuff --- python-package/lightgbm/callback.py | 8 ++++++-- python-package/lightgbm/dask.py | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/python-package/lightgbm/callback.py b/python-package/lightgbm/callback.py index d27b299ecb73..b269469909c1 100644 --- a/python-package/lightgbm/callback.py +++ b/python-package/lightgbm/callback.py @@ -3,10 +3,14 @@ import collections from dataclasses import dataclass from functools import partial -from typing import Any, Callable, Dict, List, Optional, Tuple, Union +from typing import TYPE_CHECKING, Any, Callable, Dict, List, Optional, Tuple, Union from .basic import Booster, _ConfigAliases, _LGBM_BoosterEvalMethodResultType, _log_info, _log_warning +if TYPE_CHECKING: + from .engine import CVBooster + + __all__ = [ 'early_stopping', 'log_evaluation', @@ -42,7 +46,7 @@ def __init__(self, best_iteration: int, best_score: _EvalResultTuple) -> None: # Callback environment used by callbacks @dataclass class CallbackEnv: - model: Booster + model: Union[Booster, "CVBooster"] params: Dict[str, Any] iteration: int begin_iteration: int diff --git a/python-package/lightgbm/dask.py b/python-package/lightgbm/dask.py index 7427611fea22..f458dde7b08d 100644 --- a/python-package/lightgbm/dask.py +++ b/python-package/lightgbm/dask.py @@ -42,7 +42,7 @@ @dataclass class _HostWorkers: default: str - all_workers: str + all_workers: Listr[str] class _DatasetNames(Enum): From bdf9b45599f326b4e23555800aa6a909bba883c6 Mon Sep 17 00:00:00 2001 From: James Lamb Date: Fri, 3 Mar 2023 23:58:26 -0600 Subject: [PATCH 4/4] typo --- python-package/lightgbm/dask.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python-package/lightgbm/dask.py b/python-package/lightgbm/dask.py index f458dde7b08d..986d8a5fb564 100644 --- a/python-package/lightgbm/dask.py +++ b/python-package/lightgbm/dask.py @@ -42,7 +42,7 @@ @dataclass class _HostWorkers: default: str - all_workers: Listr[str] + all_workers: List[str] class _DatasetNames(Enum):