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

2024-04-19 00:40:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我与第三方图书馆,我是新来的工作。我正在尝试调用一个方法,但找不到它。它在self。。。在某个地方。它可以在child属性上,也可以在child的子属性上,或者在child的子属性的子属性上——在self的深处。但我找不到。这是一棵大树,所以找到它要花很长时间。你知道吗

我怎么找到它?你知道吗

这是一个普遍的问题。任何人在第一次学习一个新的图书馆,尤其是一个复杂的图书馆时,都可能发生这种情况。我们都知道RTFM,但有时这还不够。如果我们可以访问源代码,我们就可以读取源代码。但是,如果图书馆是一个复杂的、经过大量装饰、包装、重新设计的、坚实的图书馆,那么上面的内容可能不会很有成效。你知道吗

我试过搞乱vars()dir()inspect模块,但到目前为止效果不佳。我可能用错了。你知道吗


Tags: 方法selfchild内容属性图书馆源代码地方
1条回答
网友
1楼 · 发布于 2024-04-19 00:40:35

下面是一些黑客代码,它递归地遍历对象的属性,查找具有给定名称的任何属性。 在本例中,在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分钟。你知道吗

相关问题 更多 >