如何在python中获取完整的类型名?
在Python中打印如何在python中获取完整的类型名?,python,Python,在Python中打印type()的结果有时会显示不在当前范围内的类型名称。例如,以下代码将显示“” 但当前范围内没有帧类型!如果我试图在交互式解释器中使用它,我会得到一个错误: >>> frame NameError: name 'frame' is not defined 那么,有没有办法获得“完全限定”的类型名,比如“inspect.something.frame”,这样我就可以在代码中引用它 更新 不幸的是,\uuuuuu模块\uuuuuu也不工作: >>&
type()
的结果有时会显示不在当前范围内的类型名称。例如,以下代码将显示“”
但当前范围内没有帧
类型!如果我试图在交互式解释器中使用它,我会得到一个错误:
>>> frame
NameError: name 'frame' is not defined
那么,有没有办法获得“完全限定”的类型名,比如“inspect.something.frame”,这样我就可以在代码中引用它
更新
不幸的是,\uuuuuu模块\uuuuuu
也不工作:
>>> type( a ).__module__
'__builtin__'
如果要查找与帧类型对应的Python对象,可以使用:
In [38]: import types
In [39]: types.FrameType
Out[39]: <type 'frame'>
如果查看
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或其他任何东西。没有简单的方法可以做到这一点。通常,您可以使用:
x.__module__ + '.' + x.__name__
但是,如果无法从其模块访问对象,则此操作将不起作用;例如,如果模块使用del
从其命名空间中删除对象,则可能发生这种情况
对于类方法,引入了\uuuuu qualname\uuuu
属性;但这在这种情况下也无济于事<代码>类型(a)。\uuuu模块\uuuuuu是内置的,但框架
不是内置的模块中的名称。这在C中实现的类型中相当常见
在这种情况下,您必须知道帧
类型位于类型
模块中:
from types import FrameType as frame
unutbu的答案已经包括了这里的所有具体细节,但让我们退一步
一般来说,你想做的是不可能的。不只是为了帧,而是为了任何东西
print(x)
隐式打印出str(x)
。如果幸运的话,这与repr(x)
是一样的,但通常它会给你一些人类可读的东西,而不是计算机可用的东西
当然,您可以通过使用repr(x)
而不是str(x)
来解决这个问题。但这仍然无济于事
这是一个很好的经验法则,repr(a)
给你一些用尖括号括起来的无用的东西,或者可以eval
返回到==a
的值。但即使是这样,也不可靠;这只是一条经验法则
在这种情况下,一旦你得到了
,这显然是第一种repr
,它是无用的
但是有一个好消息:你所需要做的就是保持x
在周围,而不是保持repr(x)
在周围,然后尝试重新构建x
或者,在这种情况下,保持type(a)
,你就有了框架类型。你是说>>>框架
而不是>>类型
?@mgi是的,当然,谢谢!我认为这是行不通的。正如下面的一个答案提到的那样,\uuuuuu module\uuuu
属性可能有助于获得部分解决方案,但一般情况下是无法解决的。这里的实际用例是什么?你想写什么样的代码,如果不从字符串“
到类型帧
(并且不访问从中获取字符串的类型对象),你就不能写?这应该是类型(a)。\uuu模块\uuuu
这是不公平的:)。我无法“知道”帧实际上是FrameType
中的types
。有没有办法不事先知道就解决这个问题?@EyeofHell:你不需要知道,因为你永远不需要动态地发现类型。FrameType
。当你知道你需要一个框架类型,并且需要知道它是什么类型时,这个定义就存在了。另一方面,如果您已经有了一个框架a
,则只需键入(a)
即可获得该类型。重读联合国大学的答案;它非常详细地解释了所有内容。我正在寻找一种方法,在不预先了解类型的情况下计算对象类型。FrameType
。从我的示例中只给出了a
对象,而不知道frame
是types.FrameType
-你怎么知道呢?使用type(a)
没有错。一个对象就是一个对象,你已经找到了你想要的对象。如果愿意,只需定义FrameType=type(a)
。不需要了解aprior关于类型。FrameType
。如果您查看类型
模块内部,您可能会惊讶地发现这就是它们定义类型的基本方式。FrameType
。给定frame
-您如何发现它在类型
内部并调用FrameType
?您不需要这样做。只需使用类型(框架)
。它与types.FrameType
一样好。没有什么是类型的。FrameType
可以做到类型(frame)
不能做到。我认为这里的混乱是一个更普遍的:OP希望能够在repr(type(a))
给定的条件下重构类型(a)
。一般来说,如果repr
用尖括号括起来,则不能使用它以编程方式重新构造值。因此,首先要保持类型(a)
不变,而不是试图猜测
可能指的是什么
读起来更好。但是它需要预先知道帧
的隐藏位置。@EyeofHell:是的,如果您事先静态地知道要检查帧,请使用类型。帧类型
。您找到它的方法是阅读文档
MyFrameType = type(a)
x.__module__ + '.' + x.__name__
from types import FrameType as frame