Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中获取完整的类型名?_Python - Fatal编程技术网

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

如何在python中获取完整的类型名?,python,Python,在Python中打印type()的结果有时会显示不在当前范围内的类型名称。例如,以下代码将显示“” 但当前范围内没有帧类型!如果我试图在交互式解释器中使用它,我会得到一个错误: >>> frame NameError: name 'frame' is not defined 那么,有没有办法获得“完全限定”的类型名,比如“inspect.something.frame”,这样我就可以在代码中引用它 更新 不幸的是,\uuuuuu模块\uuuuuu也不工作: >>&

在Python中打印
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