File: _get_alias.py

package info (click to toggle)
python-typish 1.9.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 324 kB
  • sloc: python: 1,632; makefile: 2
file content (40 lines) | stat: -rw-r--r-- 1,195 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import typing
from functools import lru_cache

from typish.functions._is_from_typing import is_from_typing

from typish._types import T


@lru_cache()
def get_alias(cls: T) -> typing.Optional[T]:
    """
    Return the alias from the ``typing`` module for ``cls``. For example, for
    ``cls=list``, the result would be ``typing.List``. If ``cls`` is
    parameterized (>=3.9), then a parameterized ``typing`` equivalent is
    returned. If no alias exists for ``cls``, then ``None`` is returned.
    If ``cls`` already is from ``typing`` it is returned as is.
    :param cls: the type for which the ``typing`` equivalent is to be found.
    :return: the alias from ``typing``.
    """
    if is_from_typing(cls):
        return cls
    alias = _alias_per_type.get(cls.__name__, None)
    if alias:
        args = getattr(cls, '__args__', tuple())
        if args:
            alias = alias[args]
    return alias


_alias_per_type = {
    'list': typing.List,
    'tuple': typing.Tuple,
    'dict': typing.Dict,
    'set': typing.Set,
    'frozenset': typing.FrozenSet,
    'deque': typing.Deque,
    'defaultdict': typing.DefaultDict,
    'type': typing.Type,
    'Set': typing.AbstractSet,
}