Python: pytype-совместимая команда type ()? - PullRequest
0 голосов
/ 24 мая 2018

Существует ли какая-либо type -подобная команда, которая будет проходить через коллекции для возврата декларации в стиле pytype, если такая вещь существует?Я понимаю, что коллекции с разнородными элементами могут быть проблематичными.

Например, я хотел бы видеть вывод, похожий на этот:

>>> fancy_type({1: {"a": 2.2}})
dict[int, dict[str, float]]

1 Ответ

0 голосов
/ 24 мая 2018

Насколько я знаю, такой функции не существует.Тем не менее, кажется довольно простым написать функцию, как вы описали в своем вопросе:

from typing import Iterable, Mapping


def pretty_type(obj):
    obj_type = type(obj).__name__
    if isinstance(obj, Mapping):
        k, v = next(iter(obj.items()))
        return '{}[{}, {}]'.format(obj_type, pretty_type(k), pretty_type(v))
    elif isinstance(obj, Iterable) and not isinstance(obj, str):
        return '{}[{}]'.format(obj_type, pretty_type(obj[0]))
    else:
        return obj_type

Тестирование

>>> print(pretty_type(0))
int
>>> print(pretty_type({1:{"a":2.2}}))
dict[int, dict[str, float]]
>>> print(pretty_type([1, 2, 3]))
list[int]
>>> print(pretty_type([{1:'a'}, {2:'b'}]))
list[dict[int, str]]
>>>

Приведенный выше код может быть довольно легко расширендля любого пользовательского ввода / вывода.Конечно, код явно предполагает однородность между элементами.Как вы отметили в своем вопросе, разнородные элементы были бы проблематичными, и, на мой взгляд, это действительно зависело бы от того, как они захотят иметь дело с такими случаями.

...