Python:如何显示嵌套类型信息?

Python:如何显示嵌套类型信息?,python,Python,Python是否包含一个内置的类型变量,它将显示嵌套的类型信息,比如这样 >>> extended_type([()]) <class 'list' containg <class 'tuple'>> 扩展的_类型([()]) 容器项目的类型对于容器本身的类型是不透明的。但是,您可以为实现\uuuuuu iter\uuuuu的东西制作自己的: def扩展_类型(x): 类型=集合() 如果hasattr(x,“\uuuu iter””: 对于x中的项目

Python是否包含一个内置的类型变量,它将显示嵌套的类型信息,比如这样

>>> extended_type([()])
<class 'list' containg <class 'tuple'>>
扩展的_类型([()])
容器项目的类型对于容器本身的类型是不透明的。但是,您可以为实现
\uuuuuu iter\uuuuu
的东西制作自己的:

def扩展_类型(x):
类型=集合()
如果hasattr(x,“\uuuu iter””:
对于x中的项目:
如果项==x:
#防止字符串无限递归
持续
类型.添加(扩展类型(项目))
contains=“”
如果len(类型)>0:
contains=“containing”+,”.join(类型)
返回f“”
返回f“”
扩展的_类型([(1,2,'a'),{1:2}])
# ""

容器项目的类型对于容器本身的类型是不透明的。但是,您可以为实现
\uuuuuu iter\uuuuu
的东西制作自己的:

def扩展_类型(x):
类型=集合()
如果hasattr(x,“\uuuu iter””:
对于x中的项目:
如果项==x:
#防止字符串无限递归
持续
类型.添加(扩展类型(项目))
contains=“”
如果len(类型)>0:
contains=“containing”+,”.join(类型)
返回f“”
返回f“”
扩展的_类型([(1,2,'a'),{1:2}])
# ""

否。键入提示和
键入
模块和PEP 585为此提供了一种表示法(即Python 3.9之前的
列表[元组]
列表[元组]
),但这些提示只能由外部类型检查器(如MyPy)进行检查;没有在运行时检查它的功能

在使iInstance(obj,list[str])执行运行时类型检查时:

此功能需要对集合进行迭代,这在某些集合中是一种破坏性操作。这个功能本来是有用的,但是在Python中实现处理复杂类型、嵌套类型检查、类型变量、字符串前向引用等的类型检查器超出了本PEP的范围


否。键入提示和
键入
模块以及PEP 585为此提供了一种表示法(即Python 3.9之前的
list[tuple]
list[tuple]
),但这些仅意味着由外部类型检查器(如MyPy)进行检查;没有在运行时检查它的功能

在使iInstance(obj,list[str])执行运行时类型检查时:

此功能需要对集合进行迭代,这在某些集合中是一种破坏性操作。这个功能本来是有用的,但是在Python中实现处理复杂类型、嵌套类型检查、类型变量、字符串前向引用等的类型检查器超出了本PEP的范围

@Aplet123启发了我

from typing import List
import json


def extended_type(obj, buffer_list: List = None):
    if buffer_list is None:
        buffer_list = []
    buffer_list.append(f"<class '{type(obj).__name__}'>")
    if hasattr(obj, '__iter__') and not isinstance(obj, str):
        sub_buf = []
        for item in (obj.values() if isinstance(obj, dict) else obj):
            extended_type(item, sub_buf)
        if sub_buf:
            buffer_list.append(sub_buf)
    return buffer_list
输出
[
"",
[
"",
[
"",
""
],
"",
[
"",
"",
[
"",
"",
"",
[
"",
"",
""
]
]
],
"",
[
"",
"",
"",
"",
[
"",
""
]
],
""
]
]
@Aplet123激励着我

from typing import List
import json


def extended_type(obj, buffer_list: List = None):
    if buffer_list is None:
        buffer_list = []
    buffer_list.append(f"<class '{type(obj).__name__}'>")
    if hasattr(obj, '__iter__') and not isinstance(obj, str):
        sub_buf = []
        for item in (obj.values() if isinstance(obj, dict) else obj):
            extended_type(item, sub_buf)
        if sub_buf:
            buffer_list.append(sub_buf)
    return buffer_list
输出
[
"",
[
"",
[
"",
""
],
"",
[
"",
"",
[
"",
"",
"",
[
"",
"",
""
]
]
],
"",
[
"",
"",
"",
"",
[
"",
""
]
],
""
]
]

如果我们有[“apple”,34,(“hello”,1),CustomDogObject],您会期望什么行为?据我所知,这并不多见,我认为对于可以容纳任何类型的容器来说,这都是很困难的。像约束成员资格的
numpy
pandas
之类的东西都有自己的显示类型的方式。列表不一定必须是同质的,取决于您需要什么,您可能能够自己编写如果我们有[“apple”,34,(“hello”,1),CustomDogObject],您期望什么行为?我不知道,我认为这对于任何类型的容器来说都是困难的。像约束成员资格的
numpy
pandas
之类的东西都有自己的显示类型的方式。列表不一定必须是同质的,这取决于您需要什么,您可能能够编写自己的
您的编程技能很棒<代码>你的编程技能很棒!
[
    "<class 'list'>",
    [
        "<class 'tuple'>",
        [
            "<class 'int'>",
            "<class 'str'>"
        ],
        "<class 'list'>",
        [
            "<class 'int'>",
            "<class 'list'>",
            [
                "<class 'int'>",
                "<class 'str'>",
                "<class 'list'>",
                [
                    "<class 'int'>",
                    "<class 'str'>",
                    "<class 'CC'>"
                ]
            ]
        ],
        "<class 'dict'>",
        [
            "<class 'int'>",
            "<class 'int'>",
            "<class 'str'>",
            "<class 'list'>",
            [
                "<class 'int'>",
                "<class 'str'>"
            ]
        ],
        "<class 'function'>"
    ]
]