我正在与我不熟悉的第三方图书馆合作。我试图打电话的方法,但我无法找到它。它在self
...某个地方。它可能出现在儿童属性或孩子的孩子身上,也可能出现在孩子的孩子身上 - 在self
的内心深处。但我无法找到它。它是一棵大树,所以发现这需要很长时间。
我如何找到它?
这是一个普遍的问题。任何人第一次学习新图书馆,特别是复杂图书馆时,都会遇到这种情况。我们都知道RTFM,但有时候还不够。如果我们有权访问源代码,我们就可以阅读源代码。但是,如果图书馆是复杂的,装饰精良,包装,重新考虑,SOLID原则的图书馆,上面的内容可能不会很有成效。
我试图弄乱vars()
,dir()
和inspect
模块,但到目前为止还不好。我可能错了。
答案 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分钟。