如何在Python对象上搜索/查找方法或属性? (搜索所有后代)

时间:2016-12-17 21:37:06

标签: python

我正在与我不熟悉的第三方图书馆合作。我试图打电话的方法,但我无法找到它。它在self ...某个地方。它可能出现在儿童属性或孩子的孩子身上,也可能出现在孩子的孩子身上 - 在self的内心深处。但我无法找到它。它是一棵大树,所以发现这需要很长时间。

我如何找到它?

这是一个普遍的问题。任何人第一次学习新图书馆,特别是复杂图书馆时,都会遇到这种情况。我们都知道RTFM,但有时候还不够。如果我们有权访问源代码,我们就可以阅读源代码。但是,如果图书馆是复杂的,装饰精良,包装,重新考虑,SOLID原则的图书馆,上面的内容可能不会很有成效。

我试图弄乱vars()dir()inspect模块,但到目前为止还不好。我可能错了。

1 个答案:

答案 0 :(得分:1)

这是一些hackish代码,它递归地遍历对象的属性,查找具有给定名称的任何属性。 在该示例中,将在numpy包中搜索名称为normal的任何属性。

修改:代码现在也会搜索超类。

import numpy

# Hackish function doing the recursive attribute search
def find_attr(object_name, attr_name):
    matches = []
    def f(a, search, names=None, objects=None):
        if not hasattr(a, '__dict__'):
            return
        if names is None:
            names = []
            objects = []
        for varname, var in vars(a).items():
            if varname in names:
                if var in objects:
                    continue
            if varname == search:
                matches.append(object_name + '.' + varname1 + '.' + '.'.join(names + [varname]))
            result = f(var, search, names + [varname], objects + [var])
    mother_obj = eval(object_name)
    for varname1 in dir(mother_obj):
        if varname1 == attr_name:
            matches.append(object_name + '.' + varname1)
        try:
            var = getattr(mother_obj, varname1)
        except AttributeError:
            continue
        f(var, attr_name)
    return sorted(matches, key=len) 

# Define your search
object_name = 'numpy'
attr_name = 'normal'

# Do the search
matches = find_attr(object_name, attr_name)
print('\n'.join(matches))

这给了我1240个结果,第一个是numpy.random.normal

请注意,搜索此类深层对象时,搜索可能需要一些时间才能完成。上面的例子在我的电脑上花了2分钟。