fixes for latest pylint update

This commit is contained in:
Eric 2022-08-26 11:34:08 -07:00
parent 46bef89fc8
commit 200d7946c8
No known key found for this signature in database
GPG Key ID: 89C93F0F8D6D5A98
9 changed files with 87 additions and 82 deletions

View File

@ -3995,26 +3995,26 @@
"assets/src/ba_data/python/ba/_generated/__init__.py": "https://files.ballistica.net/cache/ba1/ee/e8/cad05aa531c7faf7ff7b96db7f6e", "assets/src/ba_data/python/ba/_generated/__init__.py": "https://files.ballistica.net/cache/ba1/ee/e8/cad05aa531c7faf7ff7b96db7f6e",
"assets/src/ba_data/python/ba/_generated/enums.py": "https://files.ballistica.net/cache/ba1/b2/e5/0ee0561e16257a32830645239f34", "assets/src/ba_data/python/ba/_generated/enums.py": "https://files.ballistica.net/cache/ba1/b2/e5/0ee0561e16257a32830645239f34",
"ballisticacore-windows/Generic/BallisticaCore.ico": "https://files.ballistica.net/cache/ba1/89/c0/e32c7d2a35dc9aef57cc73b0911a", "ballisticacore-windows/Generic/BallisticaCore.ico": "https://files.ballistica.net/cache/ba1/89/c0/e32c7d2a35dc9aef57cc73b0911a",
"build/prefab/full/linux_arm64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/a5/92/92aeec83f5d8f95db1bccca613ff", "build/prefab/full/linux_arm64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/73/4e/9032c516e70eee65596d7fe806ec",
"build/prefab/full/linux_arm64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/8a/ff/6b2173474f74f98a0526e51476de", "build/prefab/full/linux_arm64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/7d/2b/fd4ce5cae4687bb9da779cb13131",
"build/prefab/full/linux_arm64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/9c/cf/8f2c5f3365f53ec3a6735e2be6be", "build/prefab/full/linux_arm64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/8b/9c/6032b711bbba319bea660e55da0c",
"build/prefab/full/linux_arm64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/7e/f6/c9e8f088e5531b072ef3a262ac10", "build/prefab/full/linux_arm64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/ac/82/f9506e68ecf3fca2622aec945940",
"build/prefab/full/linux_x86_64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/fd/29/6bcaef9c148e5372c54bebe2d05d", "build/prefab/full/linux_x86_64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/8d/b2/711860820f8d440c82ec82f08d06",
"build/prefab/full/linux_x86_64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/b8/12/c0e7299e3a57cff77016255acdee", "build/prefab/full/linux_x86_64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/fb/fa/832e958d7bbefaf9a5db1af0d86f",
"build/prefab/full/linux_x86_64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/e4/ca/cfbda182fd525a8b9acacb5b5722", "build/prefab/full/linux_x86_64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/d8/ba/f7b0862f2330d42c02e5ed70f02c",
"build/prefab/full/linux_x86_64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/07/ed/139797a46be28cd21b9f547d44b8", "build/prefab/full/linux_x86_64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/fe/a0/f6614584daeead31299af53dc5d5",
"build/prefab/full/mac_arm64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/a6/bf/b0db75eda2bf6f15a63660a54ed4", "build/prefab/full/mac_arm64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/8e/80/97d7f7a9101fd5c23e8d7276fa0c",
"build/prefab/full/mac_arm64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/e1/81/09912802880ec45a8464d8e52cda", "build/prefab/full/mac_arm64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/22/78/85498b94fe3a57f729d452e92fc8",
"build/prefab/full/mac_arm64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/ef/b9/bca5de5cfe1353bf6946e7d8900b", "build/prefab/full/mac_arm64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/ab/57/ac71a57a09557fda0d0449c090f3",
"build/prefab/full/mac_arm64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/2a/89/5d2e0e0f01d65854040a3047b8a7", "build/prefab/full/mac_arm64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/42/d7/55a58a777db03d15c4e695d2bfd9",
"build/prefab/full/mac_x86_64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/f2/8a/7de86a47c5e361e4551afeada214", "build/prefab/full/mac_x86_64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/9f/a4/8bfc34f0140430a439c4ff27c797",
"build/prefab/full/mac_x86_64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/85/94/5dd16ce67c9085eff7ddff8f8328", "build/prefab/full/mac_x86_64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/88/35/9be33899b777146d23e1026d14b0",
"build/prefab/full/mac_x86_64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/20/b3/e58610e3671e9f7ca43495c6d0f4", "build/prefab/full/mac_x86_64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/fa/34/f6cfc1fb05dc35ccccb54ac1010b",
"build/prefab/full/mac_x86_64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/95/cd/b0e50718cb24f28f8644fb521f37", "build/prefab/full/mac_x86_64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/30/c4/e646b6fb9064bac03449a03398b4",
"build/prefab/full/windows_x86_gui/debug/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/3d/13/3724b21a9cc992bf0a122334892c", "build/prefab/full/windows_x86_gui/debug/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/76/6b/e257150ce7eefb25e87de8460428",
"build/prefab/full/windows_x86_gui/release/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/c3/34/3a0c220fe8ea2ed6d1bd1fcf66b1", "build/prefab/full/windows_x86_gui/release/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/b9/d5/1f46d4ed1d2fcf973c1172d88956",
"build/prefab/full/windows_x86_server/debug/dist/BallisticaCoreHeadless.exe": "https://files.ballistica.net/cache/ba1/e6/82/3ed7bc3aff3da974f9c12ae1560f", "build/prefab/full/windows_x86_server/debug/dist/BallisticaCoreHeadless.exe": "https://files.ballistica.net/cache/ba1/87/24/5ba20247eb4fb38d2dde7aee869f",
"build/prefab/full/windows_x86_server/release/dist/BallisticaCoreHeadless.exe": "https://files.ballistica.net/cache/ba1/ca/f0/d9e7b0b303d579b988d0b5934156", "build/prefab/full/windows_x86_server/release/dist/BallisticaCoreHeadless.exe": "https://files.ballistica.net/cache/ba1/65/a2/c3e61796608b2a8bad0928b1d071",
"build/prefab/lib/linux_arm64_gui/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/3b/0c/2f4061ab877d415a1c30e0e736db", "build/prefab/lib/linux_arm64_gui/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/3b/0c/2f4061ab877d415a1c30e0e736db",
"build/prefab/lib/linux_arm64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/3c/5a/2b0714af254c64954ccfe51c70b3", "build/prefab/lib/linux_arm64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/3c/5a/2b0714af254c64954ccfe51c70b3",
"build/prefab/lib/linux_arm64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/1f/ae/c8a885b1a1868b6846b606cdb456", "build/prefab/lib/linux_arm64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/1f/ae/c8a885b1a1868b6846b606cdb456",
@ -4031,14 +4031,14 @@
"build/prefab/lib/mac_x86_64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/44/df/efb51d1c226eac613d48e2cbf0b8", "build/prefab/lib/mac_x86_64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/44/df/efb51d1c226eac613d48e2cbf0b8",
"build/prefab/lib/mac_x86_64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/1c/f6/357fe951c86c9fc5b1b737cd91ae", "build/prefab/lib/mac_x86_64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/1c/f6/357fe951c86c9fc5b1b737cd91ae",
"build/prefab/lib/mac_x86_64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/04/17/e2de0ab5df6b938d828e8662ce6d", "build/prefab/lib/mac_x86_64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/04/17/e2de0ab5df6b938d828e8662ce6d",
"build/prefab/lib/windows/Debug_Win32/BallisticaCoreGenericInternal.lib": "https://files.ballistica.net/cache/ba1/43/12/99b9029b31f9abcede32734e9a83", "build/prefab/lib/windows/Debug_Win32/BallisticaCoreGenericInternal.lib": "https://files.ballistica.net/cache/ba1/69/dc/6fc1614b2548c6ac76c9e891c2e2",
"build/prefab/lib/windows/Debug_Win32/BallisticaCoreGenericInternal.pdb": "https://files.ballistica.net/cache/ba1/f0/27/523ae5d573666078314cbbd988b1", "build/prefab/lib/windows/Debug_Win32/BallisticaCoreGenericInternal.pdb": "https://files.ballistica.net/cache/ba1/c2/1b/263c5e001c6891d774d941f0bdfd",
"build/prefab/lib/windows/Debug_Win32/BallisticaCoreHeadlessInternal.lib": "https://files.ballistica.net/cache/ba1/41/bb/1326d20b151d47d67969d4525e4a", "build/prefab/lib/windows/Debug_Win32/BallisticaCoreHeadlessInternal.lib": "https://files.ballistica.net/cache/ba1/7b/3a/f77ffca8d7c45b859d1e48c1b468",
"build/prefab/lib/windows/Debug_Win32/BallisticaCoreHeadlessInternal.pdb": "https://files.ballistica.net/cache/ba1/77/3f/6e98ac94c728a0f210b8ce05c418", "build/prefab/lib/windows/Debug_Win32/BallisticaCoreHeadlessInternal.pdb": "https://files.ballistica.net/cache/ba1/88/15/1aa07f986d0bf7dac9a1f39635f2",
"build/prefab/lib/windows/Release_Win32/BallisticaCoreGenericInternal.lib": "https://files.ballistica.net/cache/ba1/90/28/8c0aec847a6ebb6e2977e7b50d21", "build/prefab/lib/windows/Release_Win32/BallisticaCoreGenericInternal.lib": "https://files.ballistica.net/cache/ba1/4b/e1/646d3095ab442e0b18d4c0de9689",
"build/prefab/lib/windows/Release_Win32/BallisticaCoreGenericInternal.pdb": "https://files.ballistica.net/cache/ba1/65/fc/f7c1c6c6208814d721687fa08c5f", "build/prefab/lib/windows/Release_Win32/BallisticaCoreGenericInternal.pdb": "https://files.ballistica.net/cache/ba1/0f/fe/034c116781ddfe6cc89ada030056",
"build/prefab/lib/windows/Release_Win32/BallisticaCoreHeadlessInternal.lib": "https://files.ballistica.net/cache/ba1/a7/6b/148a238b89c17790b9dedc481031", "build/prefab/lib/windows/Release_Win32/BallisticaCoreHeadlessInternal.lib": "https://files.ballistica.net/cache/ba1/91/64/10fcd883cf0d15895d72a638e2ad",
"build/prefab/lib/windows/Release_Win32/BallisticaCoreHeadlessInternal.pdb": "https://files.ballistica.net/cache/ba1/41/9d/61822652055f9319630ea3611cad", "build/prefab/lib/windows/Release_Win32/BallisticaCoreHeadlessInternal.pdb": "https://files.ballistica.net/cache/ba1/1e/69/bf40bc8defe923cfa6d48cb5dd04",
"src/ballistica/generated/python_embedded/binding.inc": "https://files.ballistica.net/cache/ba1/7d/3e/229a581cb2454ed856f1d8b564a7", "src/ballistica/generated/python_embedded/binding.inc": "https://files.ballistica.net/cache/ba1/7d/3e/229a581cb2454ed856f1d8b564a7",
"src/ballistica/generated/python_embedded/bootstrap.inc": "https://files.ballistica.net/cache/ba1/aa/a5/3ddc86d1789b2bf1d376b7671a3d" "src/ballistica/generated/python_embedded/bootstrap.inc": "https://files.ballistica.net/cache/ba1/aa/a5/3ddc86d1789b2bf1d376b7671a3d"
} }

View File

@ -1,4 +1,4 @@
### 1.7.7 (build 20717, api 7, 2022-08-25) ### 1.7.7 (build 20721, api 7, 2022-08-26)
- Added `ba.app.meta.load_exported_classes()` for loading classes discovered by the meta subsystem cleanly in a background thread. - Added `ba.app.meta.load_exported_classes()` for loading classes discovered by the meta subsystem cleanly in a background thread.
- Improved logging of missing playlist game types. - Improved logging of missing playlist game types.
- Some ba.Lstr functionality can now be used in background threads. - Some ba.Lstr functionality can now be used in background threads.

View File

@ -15,7 +15,7 @@ if TYPE_CHECKING:
from typing import Any, Literal from typing import Any, Literal
import ba import ba
TA = TypeVar('TA', bound='Actor') ActorT = TypeVar('ActorT', bound='Actor')
class Actor: class Actor:
@ -95,7 +95,7 @@ class Actor:
return UNHANDLED return UNHANDLED
def autoretain(self: TA) -> TA: def autoretain(self: ActorT) -> ActorT:
"""Keep this Actor alive without needing to hold a reference to it. """Keep this Actor alive without needing to hold a reference to it.
This keeps the ba.Actor in existence by storing a reference to it This keeps the ba.Actor in existence by storing a reference to it

View File

@ -31,13 +31,11 @@ class Existable(Protocol):
"""Whether this object exists.""" """Whether this object exists."""
# pylint: disable=invalid-name ExistableT = TypeVar('ExistableT', bound=Existable)
ExistableType = TypeVar('ExistableType', bound=Existable)
# pylint: enable=invalid-name
T = TypeVar('T') T = TypeVar('T')
def existing(obj: ExistableType | None) -> ExistableType | None: def existing(obj: ExistableT | None) -> ExistableT | None:
"""Convert invalid references to None for any ba.Existable object. """Convert invalid references to None for any ba.Existable object.
Category: **Gameplay Functions** Category: **Gameplay Functions**
@ -251,6 +249,10 @@ class _Call:
if TYPE_CHECKING: if TYPE_CHECKING:
# Some interaction between our ballistica pylint plugin
# and this code is crashing starting on pylint 2.15.0.
# This seems to fix things for now.
# pylint: disable=all
WeakCall = Call WeakCall = Call
Call = Call Call = Call
else: else:

View File

@ -21,7 +21,7 @@
namespace ballistica { namespace ballistica {
// These are set automatically via script; don't modify them here. // These are set automatically via script; don't modify them here.
const int kAppBuildNumber = 20717; const int kAppBuildNumber = 20721;
const char* kAppVersion = "1.7.7"; const char* kAppVersion = "1.7.7";
// Our standalone globals. // Our standalone globals.

View File

@ -30,6 +30,8 @@ if TYPE_CHECKING:
TOOL_NAME = 'bacloud' TOOL_NAME = 'bacloud'
TIMEOUT_SECONDS = 60 * 5
# Server we talk to (can override via env var). # Server we talk to (can override via env var).
BACLOUD_SERVER_URL = os.getenv('BACLOUD_SERVER_URL', 'https://ballistica.net') BACLOUD_SERVER_URL = os.getenv('BACLOUD_SERVER_URL', 'https://ballistica.net')
@ -152,8 +154,11 @@ class App:
# Using requests module. # Using requests module.
else: else:
with requests.post(url, headers=headers, data=rdata, with requests.post(url,
files=files) as response_raw: headers=headers,
data=rdata,
files=files,
timeout=TIMEOUT_SECONDS) as response_raw:
response_raw.raise_for_status() response_raw.raise_for_status()
assert isinstance(response_raw.content, bytes) assert isinstance(response_raw.content, bytes)
response_content = response_raw.content.decode() response_content = response_raw.content.decode()

View File

@ -243,7 +243,7 @@ def push_ipa() -> None:
root = Path(sys.argv[0], '../..').resolve() root = Path(sys.argv[0], '../..').resolve()
if len(sys.argv) != 3: if len(sys.argv) != 3:
raise Exception('expected 1 arg (debug or release)') raise Exception('expected 1 arg (debug or release)')
modename = sys.argv[2] modename = sys.argv[2].lower()
efrotools.ios.push_ipa(root, modename) efrotools.ios.push_ipa(root, modename)

View File

@ -7,7 +7,7 @@ Supports static typing for message types and possible return types.
from __future__ import annotations from __future__ import annotations
import logging import logging
from typing import TYPE_CHECKING, TypeVar from typing import TYPE_CHECKING
from efro.error import CleanError, RemoteError, CommunicationError from efro.error import CleanError, RemoteError, CommunicationError
from efro.message._message import EmptyResponse, ErrorResponse from efro.message._message import EmptyResponse, ErrorResponse
@ -18,8 +18,6 @@ if TYPE_CHECKING:
from efro.message._message import Message, Response from efro.message._message import Message, Response
from efro.message._protocol import MessageProtocol from efro.message._protocol import MessageProtocol
TM = TypeVar('TM', bound='MessageSender')
class MessageSender: class MessageSender:
"""Facilitates sending messages to a target and receiving responses. """Facilitates sending messages to a target and receiving responses.

View File

@ -27,11 +27,11 @@ if TYPE_CHECKING:
from typing import Any, Callable, NoReturn from typing import Any, Callable, NoReturn
T = TypeVar('T') T = TypeVar('T')
TVAL = TypeVar('TVAL') ValT = TypeVar('ValT')
TARG = TypeVar('TARG') ArgT = TypeVar('ArgT')
TSELF = TypeVar('TSELF') SelfT = TypeVar('SelfT')
TRET = TypeVar('TRET') RetT = TypeVar('RetT')
TENUM = TypeVar('TENUM', bound=Enum) EnumT = TypeVar('EnumT', bound=Enum)
class _EmptyObj: class _EmptyObj:
@ -44,7 +44,7 @@ else:
Call = functools.partial Call = functools.partial
def enum_by_value(cls: type[TENUM], value: Any) -> TENUM: def enum_by_value(cls: type[EnumT], value: Any) -> EnumT:
"""Create an enum from a value. """Create an enum from a value.
This is basically the same as doing 'obj = EnumType(value)' except This is basically the same as doing 'obj = EnumType(value)' except
@ -251,15 +251,15 @@ class DirtyBit:
return False return False
class DispatchMethodWrapper(Generic[TARG, TRET]): class DispatchMethodWrapper(Generic[ArgT, RetT]):
"""Type-aware standin for the dispatch func returned by dispatchmethod.""" """Type-aware standin for the dispatch func returned by dispatchmethod."""
def __call__(self, arg: TARG) -> TRET: def __call__(self, arg: ArgT) -> RetT:
pass pass
@staticmethod @staticmethod
def register( def register(
func: Callable[[Any, Any], TRET]) -> Callable[[Any, Any], TRET]: func: Callable[[Any, Any], RetT]) -> Callable[[Any, Any], RetT]:
"""Register a new dispatch handler for this dispatch-method.""" """Register a new dispatch handler for this dispatch-method."""
registry: dict[Any, Callable] registry: dict[Any, Callable]
@ -267,8 +267,8 @@ class DispatchMethodWrapper(Generic[TARG, TRET]):
# noinspection PyProtectedMember,PyTypeHints # noinspection PyProtectedMember,PyTypeHints
def dispatchmethod( def dispatchmethod(
func: Callable[[Any, TARG], func: Callable[[Any, ArgT],
TRET]) -> DispatchMethodWrapper[TARG, TRET]: RetT]) -> DispatchMethodWrapper[ArgT, RetT]:
"""A variation of functools.singledispatch for methods. """A variation of functools.singledispatch for methods.
Note: as of Python 3.9 there is now functools.singledispatchmethod, Note: as of Python 3.9 there is now functools.singledispatchmethod,
@ -307,7 +307,7 @@ def dispatchmethod(
return cast(DispatchMethodWrapper, wrapper) return cast(DispatchMethodWrapper, wrapper)
def valuedispatch(call: Callable[[TVAL], TRET]) -> ValueDispatcher[TVAL, TRET]: def valuedispatch(call: Callable[[ValT], RetT]) -> ValueDispatcher[ValT, RetT]:
"""Decorator for functions to allow dispatching based on a value. """Decorator for functions to allow dispatching based on a value.
This differs from functools.singledispatch in that it dispatches based This differs from functools.singledispatch in that it dispatches based
@ -318,21 +318,21 @@ def valuedispatch(call: Callable[[TVAL], TRET]) -> ValueDispatcher[TVAL, TRET]:
return ValueDispatcher(call) return ValueDispatcher(call)
class ValueDispatcher(Generic[TVAL, TRET]): class ValueDispatcher(Generic[ValT, RetT]):
"""Used by the valuedispatch decorator""" """Used by the valuedispatch decorator"""
def __init__(self, call: Callable[[TVAL], TRET]) -> None: def __init__(self, call: Callable[[ValT], RetT]) -> None:
self._base_call = call self._base_call = call
self._handlers: dict[TVAL, Callable[[], TRET]] = {} self._handlers: dict[ValT, Callable[[], RetT]] = {}
def __call__(self, value: TVAL) -> TRET: def __call__(self, value: ValT) -> RetT:
handler = self._handlers.get(value) handler = self._handlers.get(value)
if handler is not None: if handler is not None:
return handler() return handler()
return self._base_call(value) return self._base_call(value)
def _add_handler(self, value: TVAL, def _add_handler(self, value: ValT,
call: Callable[[], TRET]) -> Callable[[], TRET]: call: Callable[[], RetT]) -> Callable[[], RetT]:
if value in self._handlers: if value in self._handlers:
raise RuntimeError(f'Duplicate handlers added for {value}') raise RuntimeError(f'Duplicate handlers added for {value}')
self._handlers[value] = call self._handlers[value] = call
@ -340,42 +340,42 @@ class ValueDispatcher(Generic[TVAL, TRET]):
def register( def register(
self, self,
value: TVAL) -> Callable[[Callable[[], TRET]], Callable[[], TRET]]: value: ValT) -> Callable[[Callable[[], RetT]], Callable[[], RetT]]:
"""Add a handler to the dispatcher.""" """Add a handler to the dispatcher."""
from functools import partial from functools import partial
return partial(self._add_handler, value) return partial(self._add_handler, value)
def valuedispatch1arg( def valuedispatch1arg(
call: Callable[[TVAL, TARG], call: Callable[[ValT, ArgT],
TRET]) -> ValueDispatcher1Arg[TVAL, TARG, TRET]: RetT]) -> ValueDispatcher1Arg[ValT, ArgT, RetT]:
"""Like valuedispatch but for functions taking an extra argument.""" """Like valuedispatch but for functions taking an extra argument."""
return ValueDispatcher1Arg(call) return ValueDispatcher1Arg(call)
class ValueDispatcher1Arg(Generic[TVAL, TARG, TRET]): class ValueDispatcher1Arg(Generic[ValT, ArgT, RetT]):
"""Used by the valuedispatch1arg decorator""" """Used by the valuedispatch1arg decorator"""
def __init__(self, call: Callable[[TVAL, TARG], TRET]) -> None: def __init__(self, call: Callable[[ValT, ArgT], RetT]) -> None:
self._base_call = call self._base_call = call
self._handlers: dict[TVAL, Callable[[TARG], TRET]] = {} self._handlers: dict[ValT, Callable[[ArgT], RetT]] = {}
def __call__(self, value: TVAL, arg: TARG) -> TRET: def __call__(self, value: ValT, arg: ArgT) -> RetT:
handler = self._handlers.get(value) handler = self._handlers.get(value)
if handler is not None: if handler is not None:
return handler(arg) return handler(arg)
return self._base_call(value, arg) return self._base_call(value, arg)
def _add_handler(self, value: TVAL, def _add_handler(self, value: ValT,
call: Callable[[TARG], TRET]) -> Callable[[TARG], TRET]: call: Callable[[ArgT], RetT]) -> Callable[[ArgT], RetT]:
if value in self._handlers: if value in self._handlers:
raise RuntimeError(f'Duplicate handlers added for {value}') raise RuntimeError(f'Duplicate handlers added for {value}')
self._handlers[value] = call self._handlers[value] = call
return call return call
def register( def register(
self, value: TVAL self, value: ValT
) -> Callable[[Callable[[TARG], TRET]], Callable[[TARG], TRET]]: ) -> Callable[[Callable[[ArgT], RetT]], Callable[[ArgT], RetT]]:
"""Add a handler to the dispatcher.""" """Add a handler to the dispatcher."""
from functools import partial from functools import partial
return partial(self._add_handler, value) return partial(self._add_handler, value)
@ -383,22 +383,22 @@ class ValueDispatcher1Arg(Generic[TVAL, TARG, TRET]):
if TYPE_CHECKING: if TYPE_CHECKING:
class ValueDispatcherMethod(Generic[TVAL, TRET]): class ValueDispatcherMethod(Generic[ValT, RetT]):
"""Used by the valuedispatchmethod decorator.""" """Used by the valuedispatchmethod decorator."""
def __call__(self, value: TVAL) -> TRET: def __call__(self, value: ValT) -> RetT:
... ...
def register( def register(
self, value: TVAL self, value: ValT
) -> Callable[[Callable[[TSELF], TRET]], Callable[[TSELF], TRET]]: ) -> Callable[[Callable[[SelfT], RetT]], Callable[[SelfT], RetT]]:
"""Add a handler to the dispatcher.""" """Add a handler to the dispatcher."""
... ...
def valuedispatchmethod( def valuedispatchmethod(
call: Callable[[TSELF, TVAL], call: Callable[[SelfT, ValT],
TRET]) -> ValueDispatcherMethod[TVAL, TRET]: RetT]) -> ValueDispatcherMethod[ValT, RetT]:
"""Like valuedispatch but works with methods instead of functions.""" """Like valuedispatch but works with methods instead of functions."""
# NOTE: It seems that to wrap a method with a decorator and have self # NOTE: It seems that to wrap a method with a decorator and have self
@ -407,18 +407,18 @@ def valuedispatchmethod(
# in the function call dict and simply return a call. # in the function call dict and simply return a call.
_base_call = call _base_call = call
_handlers: dict[TVAL, Callable[[TSELF], TRET]] = {} _handlers: dict[ValT, Callable[[SelfT], RetT]] = {}
def _add_handler(value: TVAL, addcall: Callable[[TSELF], TRET]) -> None: def _add_handler(value: ValT, addcall: Callable[[SelfT], RetT]) -> None:
if value in _handlers: if value in _handlers:
raise RuntimeError(f'Duplicate handlers added for {value}') raise RuntimeError(f'Duplicate handlers added for {value}')
_handlers[value] = addcall _handlers[value] = addcall
def _register(value: TVAL) -> Callable[[Callable[[TSELF], TRET]], None]: def _register(value: ValT) -> Callable[[Callable[[SelfT], RetT]], None]:
from functools import partial from functools import partial
return partial(_add_handler, value) return partial(_add_handler, value)
def _call_wrapper(self: TSELF, value: TVAL) -> TRET: def _call_wrapper(self: SelfT, value: ValT) -> RetT:
handler = _handlers.get(value) handler = _handlers.get(value)
if handler is not None: if handler is not None:
return handler(self) return handler(self)
@ -433,7 +433,7 @@ def valuedispatchmethod(
# In reality we just return a raw function call (for reasons listed above). # In reality we just return a raw function call (for reasons listed above).
# pylint: disable=undefined-variable, no-else-return # pylint: disable=undefined-variable, no-else-return
if TYPE_CHECKING: if TYPE_CHECKING:
return ValueDispatcherMethod[TVAL, TRET]() return ValueDispatcherMethod[ValT, RetT]()
else: else:
return _call_wrapper return _call_wrapper