我正在使用我不熟悉的第 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/