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

标签 python

我正在使用我不熟悉的第 3 方库。我正在尝试调用一种方法,但我找不到它。它在 self ……某处。它可以在子属性上,也可以在子属性上,或者在子属性的子属性上——在 self 的深处。但我找不到它。这是一棵大树,所以要花很长时间才能找到它。

如何找到它?

这是一个普遍的问题。任何人在第一次学习一个新的图书馆时,尤其是一个复杂的图书馆,都可能发生这种情况。我们都知道 RTFM,但有时这还不够。如果我们有权访问源代码,我们就可以阅读源代码。但是,如果库是复杂的、经过大量装饰、包装、重构的 SOLID 原则库,则上述内容可能不会很有成效。

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

最佳答案

这是一些骇人听闻的代码,它递归地爬行对象的属性,查找具有给定名称的任何属性。 在示例中,搜索 numpy 包以查找名称为 normal 的任何属性。

编辑:代码现在也在父类(super class)中搜索。

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 分钟。

关于python - 如何在 Python 对象上搜索/查找方法或属性? (搜索所有后代),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41203306/

相关文章:

python - pymssql INSERT不会自动递增ID

具有两个可能值的 IF block 的 Pythonic 处理

python - 使用 pygame 绘制图元时出现工件?

Python Pandas 条形图不显示颜色

python - 如何找出python模块拥有的方法、属性等

python - BeautifulSoup4 缺少标签

python - 如何计算文本文件中给定数字的频率

python - 与类相同类型的类变量

python - Pandas 到PySpark转换器

python - 将关键字 arg 传递给 python 日志记录配置文件中的日志处理程序