Total Complexity | 4 |
Total Lines | 40 |
Duplicated Lines | 47.5 % |
Changes | 0 |
Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.
Common duplication problems, and corresponding solutions are:
1 | import typing |
||
2 | from functools import lru_cache |
||
3 | |||
4 | from typish.functions._is_from_typing import is_from_typing |
||
5 | |||
6 | from typish._types import T |
||
7 | |||
8 | |||
9 | View Code Duplication | @lru_cache() |
|
|
|||
10 | def get_alias(cls: T) -> typing.Optional[T]: |
||
11 | """ |
||
12 | Return the alias from the ``typing`` module for ``cls``. For example, for |
||
13 | ``cls=list``, the result would be ``typing.List``. If ``cls`` is |
||
14 | parameterized (>=3.9), then a parameterized ``typing`` equivalent is |
||
15 | returned. If no alias exists for ``cls``, then ``None`` is returned. |
||
16 | If ``cls`` already is from ``typing`` it is returned as is. |
||
17 | :param cls: the type for which the ``typing`` equivalent is to be found. |
||
18 | :return: the alias from ``typing``. |
||
19 | """ |
||
20 | if is_from_typing(cls): |
||
21 | return cls |
||
22 | alias = _alias_per_type.get(cls.__name__, None) |
||
23 | if alias: |
||
24 | args = getattr(cls, '__args__', tuple()) |
||
25 | if args: |
||
26 | alias = alias[args] |
||
27 | return alias |
||
28 | |||
29 | |||
30 | _alias_per_type = { |
||
31 | 'list': typing.List, |
||
32 | 'tuple': typing.Tuple, |
||
33 | 'dict': typing.Dict, |
||
34 | 'set': typing.Set, |
||
35 | 'frozenset': typing.FrozenSet, |
||
36 | 'deque': typing.Deque, |
||
37 | 'defaultdict': typing.DefaultDict, |
||
38 | 'type': typing.Type, |
||
39 | 'Set': typing.AbstractSet, |
||
40 | } |
||
41 |