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

时间:2013-03-01 19:11:27

标签: python

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

import inspect
a = inspect.currentframe()
print( type( a ) )

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

>>> frame
NameError: name 'frame' is not defined

所以有没有办法获得像“inspect.something.frame”这样的“完全限定”类型名称,所以我可以在我的代码中引用它?

更新

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

>>> type( a ).__module__
'__builtin__'

3 个答案:

答案 0 :(得分:2)

"What's in a name? That which we call a frame 
 By any other name would smell as sweet."

如果要查找与框架类型相对应的Python对象,可以使用:

In [38]: import types

In [39]: types.FrameType
Out[39]: <type 'frame'>

当然,这只是写type(a)的另一种方式:

In [42]: import inspect

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

In [44]: types.FrameType == type(a)
Out[44]: True

如果查看types模块,您会发现types.FrameType以这种方式定义:

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

他们所做的只是找到frame的实例并将FrameType定义为此实例的type

这基本上就是你在定义

时所做的事情
MyFrameType = type(a)

所以结论是:要了解实例的类型,只需调用type(obj)即可。您无需知道 aprior 其他任何内容。

答案 1 :(得分:1)

没有简单的方法可以做到这一点。通常,您可以使用:

x.__module__ + '.' + x.__name__

但是,如果无法从模块访问该对象,则无法执行此操作;例如,如果模块使用del从名称空间中删除对象,则会发生这种情况。

对于类方法,PEP 3155引入了__qualname__属性;但在这种情况下,这也无济于事。 type(a).__module__'__builtin__',但frame不是__builtin__模块中的名称。这在使用C实现的类型中相当常见。

在这种情况下,您必须知道frame模块中的types类型:

from types import FrameType as frame

答案 2 :(得分:0)

unutbu的答案已经包含了所有具体细节,但让我们稍微退一步。

一般来说,你要做的是不可能的。不仅适用于帧,还适用于任何

print(x)隐式打印出str(x)。如果你很幸运,这与repr(x)相同,但通常它会为你提供一些人类可读而不是计算机可用的东西。

当然,您只需使用repr(x)代替str(x)即可解决这个问题。但仍然无效。

这是一个很好的经验法则repr(a)为您提供了一些无用的尖括号括号,或者eval可以回到== a的值。但即使这样也不能依赖;这只是一个经验法则。

在这种情况下,一旦你得到<type 'frame'>,这显然是第一种repr,而且没用。

但是有一个好消息:您需要做的只是保持x,而不是保持repr(x)并尝试稍后重建x

或者,在这种情况下,请保持type(a),并且您拥有框架类型。