Skip to content

Commit a652aaa

Browse files
committed
Add fallback for override decorator
1 parent 5d8e82d commit a652aaa

File tree

1 file changed

+34
-26
lines changed

1 file changed

+34
-26
lines changed

chess/engine.py

Lines changed: 34 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,14 @@
2424
from types import TracebackType
2525
from typing import Any, Callable, Coroutine, Deque, Dict, Generator, Generic, Iterable, Iterator, List, Literal, Mapping, MutableMapping, Optional, Tuple, Type, TypedDict, TypeVar, Union
2626

27+
try:
28+
from typing import override
29+
except:
30+
# Before Python 3.12
31+
F = typing.TypeVar("F", bound=Callable[..., Any])
32+
def override(fn: F, /) -> F:
33+
return fn
34+
2735
if typing.TYPE_CHECKING:
2836
from typing_extensions import Self
2937

@@ -1317,16 +1325,16 @@ def __init__(self, engine: UciProtocol):
13171325
super().__init__(engine)
13181326
self.engine = engine
13191327

1320-
@typing.override
1328+
@override
13211329
def check_initialized(self) -> None:
13221330
if self.engine.initialized:
13231331
raise EngineError("engine already initialized")
13241332

1325-
@typing.override
1333+
@override
13261334
def start(self) -> None:
13271335
self.engine.send_line("uci")
13281336

1329-
@typing.override
1337+
@override
13301338
def line_received(self, line: str) -> None:
13311339
token, remaining = _next_token(line)
13321340
if line.strip() == "uciok" and not self.result.done():
@@ -1415,7 +1423,7 @@ def __init__(self, engine: UciProtocol) -> None:
14151423
def start(self) -> None:
14161424
self.engine._isready()
14171425

1418-
@typing.override
1426+
@override
14191427
def line_received(self, line: str) -> None:
14201428
if line.strip() == "readyok":
14211429
self.result.set_result(None)
@@ -1574,7 +1582,7 @@ def __init__(self, engine: UciProtocol):
15741582
# MultiPV never change between pondering play commands.
15751583
engine.may_ponderhit = board if ponder and not engine.first_game and game == engine.game and not engine._changed_options(new_options) else None
15761584

1577-
@typing.override
1585+
@override
15781586
def start(self) -> None:
15791587
self.info: InfoDict = {}
15801588
self.pondering: Optional[chess.Board] = None
@@ -1605,7 +1613,7 @@ def start(self) -> None:
16051613
else:
16061614
self._readyok()
16071615

1608-
@typing.override
1616+
@override
16091617
def line_received(self, line: str) -> None:
16101618
token, remaining = _next_token(line)
16111619
if token == "info":
@@ -1662,15 +1670,15 @@ def end(self) -> None:
16621670
engine.may_ponderhit = None
16631671
self.set_finished()
16641672

1665-
@typing.override
1673+
@override
16661674
def cancel(self) -> None:
16671675
if self.engine.may_ponderhit and self.pondering and self.engine.may_ponderhit.move_stack == self.pondering.move_stack and self.engine.may_ponderhit == self.pondering:
16681676
self.engine.ponderhit = True
16691677
self.end()
16701678
else:
16711679
self.engine.send_line("stop")
16721680

1673-
@typing.override
1681+
@override
16741682
def engine_terminated(self, exc: Exception) -> None:
16751683
# Allow terminating engine while pondering.
16761684
if not self.result.done():
@@ -1705,7 +1713,7 @@ def start(self) -> None:
17051713
else:
17061714
self._readyok()
17071715

1708-
@typing.override
1716+
@override
17091717
def line_received(self, line: str) -> None:
17101718
token, remaining = _next_token(line)
17111719
if token == "info":
@@ -1738,11 +1746,11 @@ def _bestmove(self, arg: str) -> None:
17381746
self.set_finished()
17391747
self.analysis.set_finished(best)
17401748

1741-
@typing.override
1749+
@override
17421750
def cancel(self) -> None:
17431751
self.engine.send_line("stop")
17441752

1745-
@typing.override
1753+
@override
17461754
def engine_terminated(self, exc: Exception) -> None:
17471755
LOGGER.debug("%s: Closing analysis because engine has been terminated (error: %s)", self.engine, exc)
17481756
self.analysis.set_exception(exc)
@@ -1978,12 +1986,12 @@ def __init__(self, engine: XBoardProtocol):
19781986
super().__init__(engine)
19791987
self.engine = engine
19801988

1981-
@typing.override
1989+
@override
19821990
def check_initialized(self) -> None:
19831991
if self.engine.initialized:
19841992
raise EngineError("engine already initialized")
19851993

1986-
@typing.override
1994+
@override
19871995
def start(self) -> None:
19881996
self.engine.send_line("xboard")
19891997
self.engine.send_line("protover 2")
@@ -1993,7 +2001,7 @@ def timeout(self) -> None:
19932001
LOGGER.error("%s: Timeout during initialization", self.engine)
19942002
self.end()
19952003

1996-
@typing.override
2004+
@override
19972005
def line_received(self, line: str) -> None:
19982006
token, remaining = _next_token(line)
19992007
if token.startswith("#"):
@@ -2152,13 +2160,13 @@ def __init__(self, engine: XBoardProtocol):
21522160
super().__init__(engine)
21532161
self.engine = engine
21542162

2155-
@typing.override
2163+
@override
21562164
def start(self) -> None:
21572165
n = id(self) & 0xffff
21582166
self.pong = f"pong {n}"
21592167
self.engine._ping(n)
21602168

2161-
@typing.override
2169+
@override
21622170
def line_received(self, line: str) -> None:
21632171
if line == self.pong:
21642172
self.result.set_result(None)
@@ -2179,7 +2187,7 @@ def __init__(self, engine: XBoardProtocol):
21792187
super().__init__(engine)
21802188
self.engine = engine
21812189

2182-
@typing.override
2190+
@override
21832191
def start(self) -> None:
21842192
self.play_result = PlayResult(None, None)
21852193
self.stopped = False
@@ -2221,7 +2229,7 @@ def start(self) -> None:
22212229
self.engine.send_line("hard" if ponder else "easy")
22222230
self.engine.send_line("go")
22232231

2224-
@typing.override
2232+
@override
22252233
def line_received(self, line: str) -> None:
22262234
token, remaining = _next_token(line)
22272235
if token == "move":
@@ -2301,7 +2309,7 @@ def _ping_after_move(self) -> None:
23012309
self.pong_after_move = f"pong {n}"
23022310
self.engine._ping(n)
23032311

2304-
@typing.override
2312+
@override
23052313
def cancel(self) -> None:
23062314
if self.stopped:
23072315
return
@@ -2317,7 +2325,7 @@ def cancel(self) -> None:
23172325
self.pong_after_ponder = f"pong {n}"
23182326
self.engine._ping(n)
23192327

2320-
@typing.override
2328+
@override
23212329
def engine_terminated(self, exc: Exception) -> None:
23222330
# Allow terminating engine while pondering.
23232331
if not self.result.done():
@@ -2337,7 +2345,7 @@ def __init__(self, engine: XBoardProtocol):
23372345
super().__init__(engine)
23382346
self.engine = engine
23392347

2340-
@typing.override
2348+
@override
23412349
def start(self) -> None:
23422350
self.stopped = False
23432351
self.best_move: Optional[chess.Move] = None
@@ -2364,7 +2372,7 @@ def start(self) -> None:
23642372
else:
23652373
self.time_limit_handle = None
23662374

2367-
@typing.override
2375+
@override
23682376
def line_received(self, line: str) -> None:
23692377
token, remaining = _next_token(line)
23702378
if token.startswith("#"):
@@ -2405,7 +2413,7 @@ def end(self) -> None:
24052413
self.set_finished()
24062414
self.analysis.set_finished(BestMove(self.best_move, None))
24072415

2408-
@typing.override
2416+
@override
24092417
def cancel(self) -> None:
24102418
if self.stopped:
24112419
return
@@ -2418,7 +2426,7 @@ def cancel(self) -> None:
24182426
self.final_pong = f"pong {n}"
24192427
self.engine._ping(n)
24202428

2421-
@typing.override
2429+
@override
24222430
def engine_terminated(self, exc: Exception) -> None:
24232431
LOGGER.debug("%s: Closing analysis because engine has been terminated (error: %s)", self.engine, exc)
24242432

@@ -2466,7 +2474,7 @@ def __init__(self, engine: XBoardProtocol):
24662474
super().__init__(engine)
24672475
self.engine = engine
24682476

2469-
@typing.override
2477+
@override
24702478
def start(self) -> None:
24712479
self.engine._configure(options)
24722480
self.engine.target_config.update({name: value for name, value in options.items() if value is not None})
@@ -2497,7 +2505,7 @@ def __init__(self, engine: XBoardProtocol):
24972505
super().__init__(engine)
24982506
self.engine = engine
24992507

2500-
@typing.override
2508+
@override
25012509
def start(self) -> None:
25022510
if game_ending and any(c in game_ending for c in "{}\n\r"):
25032511
raise EngineError(f"invalid line break or curly braces in game ending message: {game_ending!r}")

0 commit comments

Comments
 (0)