如何在python中获取完整的类型名称?

gri*_*yvp 5 python

type()Python中的打印结果有时会显示不在当前范围内的类型名称.例如,将显示以下代码"<type 'frame'>"

import inspect
a = inspect.currentframe()
print( type( a ) )
Run Code Online (Sandbox Code Playgroud)

frame目前范围内没有类型!如果我尝试在交互式解释器中使用它,我会收到一个错误:

>>> frame
NameError: name 'frame' is not defined
Run Code Online (Sandbox Code Playgroud)

那么有什么方法可以得到像"inspect.something.frame"这样的"完全限定"类型名称,所以我可以在我的代码中引用它吗?

UPDATE

不幸的是,__module__它也不起作用:

>>> type( a ).__module__
'__builtin__'
Run Code Online (Sandbox Code Playgroud)

unu*_*tbu 3

"What's in a name? That which we call a frame 
 By any other name would smell as sweet."
Run Code Online (Sandbox Code Playgroud)

如果您正在寻找与框架类型相对应的 Python 对象,您可以使用:

In [38]: import types

In [39]: types.FrameType
Out[39]: <type 'frame'>
Run Code Online (Sandbox Code Playgroud)

当然,这只是另一种写法type(a)

In [42]: import inspect

In [43]: a = inspect.currentframe()

In [44]: types.FrameType == type(a)
Out[44]: True
Run Code Online (Sandbox Code Playgroud)

如果你查看types模块内部,你会发现它types.FrameType是这样定义的:

try:
    raise TypeError
except TypeError:
    tb = sys.exc_info()[2]
    TracebackType = type(tb)
    FrameType = type(tb.tb_frame)
    del tb
Run Code Online (Sandbox Code Playgroud)

他们所做的就是找到一个实例frame并定义FrameType为该type实例的实例。

这本质上就是您定义时所做的事情

MyFrameType = type(a)
Run Code Online (Sandbox Code Playgroud)

所以结论是:要获取实例的类型,只需调用type(obj). 你不需要事先知道任何其他事情。