Mypy correctly rejects this: ❯ type .\t.py from numbers import Number from typing import Dict
Data = Dict[str, Number] def foo(bar: Data): print(bar) bar[1.0] = b'hello' PS 17:48 00:00.008 C:\Work\Scratch\foo ❯ mypy .\t.py t.py:9: error: Invalid index type "float" for "Dict[str, Number]"; expected type "str" t.py:9: error: Incompatible types in assignment (expression has type "bytes", target has type "Number") Found 2 errors in 1 file (checked 1 source file) If typeguard doesn't, maybe you need to raise that as a bug against that project? Paul On Fri, 15 Oct 2021 at 17:20, Sebastian M. Ernst <er...@pleiszenburg.de> wrote: > > Hi all, > > disclaimer: I have no idea on potential syntax or if it is applicable to > a wide audience or if there is already a good solution to this. It is > more like a "gap" in the type hint spec that I ran across in a project. > > In function/method signatures, I can hint at dictionaries for example as > follows: > > ```python > from numbers import Number > from typing import Dict > > from typeguard import typechecked > > Data = Dict[str, Number] > > @typechecked > def foo(bar: Data): > print(bar) > ``` > > Yes, this is using run-time checks (typeguard), which works just fine. > Only strings as keys and Number objects as values are going through. (I > was told that MyPy does not get this at the moment.) > > The issue is that `bar` itself still allows "everything" to go in (and out): > > ```python > @typechecked > def foo2(bar: Data): > bar[1.0] = b'should not be allowed' > ``` > > PEP 589 introduces typed dictionaries, but for a fixed set of predefined > keys (similar to struct-like constructs in other languages). In > contrast, I am looking for an arbitrary number of typed keys/value pairs. > > For reference, related question on SO: > https://stackoverflow.com/q/69555006/1672565 > > Best regards, > Sebastian > _______________________________________________ > Python-ideas mailing list -- python-ideas@python.org > To unsubscribe send an email to python-ideas-le...@python.org > https://mail.python.org/mailman3/lists/python-ideas.python.org/ > Message archived at > https://mail.python.org/archives/list/python-ideas@python.org/message/DY5DPGWXLOOP3NQYSD73S53EMTRNKD74/ > Code of Conduct: http://python.org/psf/codeofconduct/ _______________________________________________ Python-ideas mailing list -- python-ideas@python.org To unsubscribe send an email to python-ideas-le...@python.org https://mail.python.org/mailman3/lists/python-ideas.python.org/ Message archived at https://mail.python.org/archives/list/python-ideas@python.org/message/FOJST3EZKQMK2R342OWN5M3VPEBNYXSC/ Code of Conduct: http://python.org/psf/codeofconduct/