6

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__'
4

3 回答 3

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并定义FrameTypetype这个实例的实例。

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

MyFrameType = type(a)

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

于 2013-03-01T19:17:27.687 回答
1

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

x.__module__ + '.' + x.__name__

但是,如果无法从其模块中访问该对象,这将不起作用;例如,如果模块用于del从其命名空间中删除对象,就会发生这种情况。

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

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

from types import FrameType as frame
于 2013-03-01T19:18:29.917 回答
1

unutbu 的回答已经包含了这里的所有具体细节,但让我们退后一步。

通常,您要尝试做的事情是不可能的。不仅适用于框架,还适用于任何东西

print(x)隐式打印出str(x). 如果你幸运的话,这和 是一样的repr(x),但它通常给你一些人类可读的东西,而不是计算机可用的东西。

当然,您可以通过使用repr(x)而不是str(x). 但这仍然没有帮助。

这是一个很好的经验法则,repr(a)它可以给你一些用尖括号括起来的无用的东西,或者可以eval返回一个值的东西== a。但即使这样也不能依赖;这只是一个经验法则。

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

但有一个好消息:你需要做的就是保持不变x,而不是保持不变并在以后repr(x)尝试重建x

或者,在这种情况下,保持不变type(a),你就有了框架类型。

于 2013-03-01T19:42:43.047 回答