给定一个python对象,我们如何获得该对象具有直接句柄/引用的所有内容的完整列表?

给定一个python对象,我们如何获得该对象具有直接句柄/引用的所有内容的完整列表?,python,python-3.x,python-2.7,getattr,getattribute,Python,Python 3.x,Python 2.7,Getattr,Getattribute,假设我们得到一个python对象。我们不知道它从哪里来,也不知道它包含什么。通过调用对象上的各种函数,我们如何才能为对象引用的数据导出一个确定的名称列表 我只对通过python API访问的数据感兴趣。如果一个对象有一些在python中没有相应接口的低级内存缓冲区,那么我不需要访问它;但是我想知道如何访问对象所具有的每个python接口 我的问题类似于询问如何获得python对象所有属性的列表。然而,有一些警告 我不希望任何重载的\uuuu getattribute\uuu(点运算符)方法妨碍我

假设我们得到一个python对象。我们不知道它从哪里来,也不知道它包含什么。通过调用对象上的各种函数,我们如何才能为对象引用的数据导出一个确定的名称列表

我只对通过python API访问的数据感兴趣。如果一个对象有一些在python中没有相应接口的低级内存缓冲区,那么我不需要访问它;但是我想知道如何访问对象所具有的每个python接口

我的问题类似于询问如何获得python对象所有属性的列表。然而,有一些警告

我不希望任何重载的
\uuuu getattribute\uuu
(点运算符)方法妨碍我。我们可以通过调用,
对象来绕过任何重载的点运算符。但是,调用
对象。\uuuu getattribute\uuuu
要求我们已经有权访问我们关心的属性的名称。对于我设想的用法,我们不知道对象来自何处,也不知道其属性的名称可能是什么。我们根本不知道将哪些字符串传递到
obj.\uuu getattribute\uuuu

python的
dir()
dir
将返回类方法。但是,python对象没有对类方法的直接引用。通常,对象将有一个对其实例化的类的引用(通过
\uuuuu base\uuuu
)。然后,类实际上是对方法的引用。类方法是类的属性,而不是实例/对象的属性。因此,
dir(obj)
返回不直接属于
obj
的东西。另一种看法是,我寻求的是单层访问,而不是多层访问。如果一个python对象(dictionary键)指向另一个dictionary,它指向另一个dictionary,依此类推,那么我只想访问名称/标签所引用的第一个dictionary
dir
转到并获取对象没有直接指针指向的对象的名称


起初,我认为每个python对象都有一个“dict”属性,“dict”是对象封装的所有名称的最终列表。然而,事实并非如此。另外,
vars(obj)
是不可接受的,因为它会对许多python对象抛出错误,包括一些内置类的实例。我正在寻找一个解决方案,它可以告诉我们一些关于任何python对象的信息;不适用于某些情况,但会引发其他情况的异常。

您可能希望尝试
vars(obj)
然后捕获一个类型错误,然后尝试类似于
{x:getattr(a,x)for x in a.。\uu slots\uuuu}
,在这种情况下,您将捕获一个属性错误,然后该对象就没有任何对其他对象的直接引用。
gc.get\u referents()
可能是最通用的解决方案,但即使这样也不能适用于所有类型。无论你做什么,你永远都无法获得100%的覆盖率,除非你愿意使用
try
/
尝试在某些对象上引发异常的事情,否则你将一事无成。