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)
"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). 你不需要事先知道任何其他事情。