cattrs icon indicating copy to clipboard operation
cattrs copied to clipboard

Error when Literal used as dict key type

Open psarka opened this issue 3 years ago • 0 comments

  • cattrs version: 22.1.0
  • Python version: 3.10.4
  • Operating System: Ubuntu

Description

Hi, awesome library! Pushing the limits here :)

As named, Literal don't seem to work when used as dict key type.

Repro

from typing import Literal

import cattr

N = Literal['one', 'two']

cattr.structure('one', N)                  # works
cattr.structure(['one'], list[N])          # works
cattr.structure({'one': 5}, dict[N, int])  # crashes

Error

Traceback (most recent call last):


  Input In [24] in <cell line: 10>
    cattr.structure({'one': 5}, dict[N, int])

python3.10/site-packages/cattrs/converters.py:281 in structure
    return self._structure_func.dispatch(cl)(obj, cl)
python3.10/site-packages/cattr/dispatch.py:49 in _dispatch
    return self._function_dispatch.dispatch(cl)
python3.10/site-packages/cattr/dispatch.py:122 in dispatch
    return handler(typ)
python3.10/site-packages/cattrs/converters.py:802 in gen_structure_mapping
    h = make_mapping_structure_fn(cl, self)
python3.10/site-packages/cattrs/gen.py:716 in make_mapping_structure_fn
    eval(compile(script, "", "exec"), globs)

  File <string>:17
    raise IterableValidationError('While structuring dict[typing.Literal['one', 'two'], int]', errors, __cattr_mapping_cl)
                                  ^
SyntaxError: invalid syntax. Perhaps you forgot a comma?

psarka avatar Apr 12 '22 22:04 psarka