Python:pytype兼容的type()命令?

时间:2018-05-23 23:51:35

标签: python types pytype

是否有任何类似type的命令会通过集合递归返回pytype-style声明(如果存在这样的话)?我意识到具有异构元素的集合可能存在问题。

例如,我希望看到与此类似的输出:

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

1 个答案:

答案 0 :(得分:1)

据我所知,没有这样的功能。但是,编写函数似乎相当简单,如您在问题中描述的那样:

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]]
>>>

上述代码可以很容易地扩展,以适应任何自定义输入/输出。当然,代码显然假设元素之间的同质性。正如你在你的问题中所指出的那样,异构元素会有问题,而且我认为这实际上取决于一个人对如何处理这类案件的品味。