在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__'
答案 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)
,并且您拥有框架类型。