diff --git a/CHANGES.rst b/CHANGES.rst index 58bb3a7..ab6201f 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -6,6 +6,7 @@ Unreleased - Restore identity handling for ``str`` and ``int`` senders. :pr:`148` - Fix deprecated ``blinker.base.WeakNamespace`` import. :pr:`149` - Use types from ``collections.abc`` instead of ``typing``. :pr:`150` +- Fully specify exported types as reported by pyright. :pr:`152` Version 1.8.0 diff --git a/src/blinker/base.py b/src/blinker/base.py index a68efa2..1b802b6 100644 --- a/src/blinker/base.py +++ b/src/blinker/base.py @@ -529,7 +529,18 @@ def __repr__(self) -> str: return f"{base[:-1]}; {self.name!r}>" # noqa: E702 -class Namespace(dict): # type: ignore[type-arg] +if t.TYPE_CHECKING: + + class PNamespaceSignal(t.Protocol): + def __call__(self, name: str, doc: str | None = None) -> NamedSignal: ... + + # Python < 3.9 + _NamespaceBase = dict[str, NamedSignal] # type: ignore[misc] +else: + _NamespaceBase = dict + + +class Namespace(_NamespaceBase): """A dict mapping names to signals.""" def signal(self, name: str, doc: str | None = None) -> NamedSignal: @@ -539,11 +550,10 @@ def signal(self, name: str, doc: str | None = None) -> NamedSignal: :param name: The name of the signal. :param doc: The docstring of the signal. """ - try: - return self[name] # type: ignore[no-any-return] - except KeyError: - result = self.setdefault(name, NamedSignal(name, doc)) - return result # type: ignore[no-any-return] + if name not in self: + self[name] = NamedSignal(name, doc) + + return self[name] class _WeakNamespace(WeakValueDictionary): # type: ignore[type-arg] @@ -575,19 +585,18 @@ def signal(self, name: str, doc: str | None = None) -> NamedSignal: :param name: The name of the signal. :param doc: The docstring of the signal. """ - try: - return self[name] # type: ignore[no-any-return] - except KeyError: - result = self.setdefault(name, NamedSignal(name, doc)) - return result # type: ignore[no-any-return] + if name not in self: + self[name] = NamedSignal(name, doc) + + return self[name] # type: ignore[no-any-return] -default_namespace = Namespace() +default_namespace: Namespace = Namespace() """A default :class:`Namespace` for creating named signals. :func:`signal` creates a :class:`NamedSignal` in this namespace. """ -signal = default_namespace.signal +signal: PNamespaceSignal = default_namespace.signal """Return a :class:`NamedSignal` in :data:`default_namespace` with the given ``name``, creating it if required. Repeated calls with the same name return the same signal. diff --git a/tox.ini b/tox.ini index 6de8000..d1219e5 100644 --- a/tox.ini +++ b/tox.ini @@ -24,6 +24,7 @@ deps = -r requirements/typing.txt commands = mypy pyright + pyright --verifytypes blinker --ignoreexternal [testenv:docs] deps = -r requirements/docs.txt