gpt4 book ai didi

python - 搜索Python对象层次结构

转载 作者:行者123 更新时间:2023-12-01 00:16:15 24 4
gpt4 key购买 nike

我正在使用一个不稳定的 python 库,该库的各个 git 子模块中的 API 正在发生变化。每隔几周,某些成员或方法的位置就会发生更改或重命名。例如,表达式

vk.rinkront[0].asyncamera.printout()

几周前还有效,现在有 asyncamera成员位于

vk.toplink.enabledata.tx[0].asyncamera[0].print()

我设法通过 grep 找出该方法的新位置ing,git diff ing,ipython 自动完成,而且通常都是笨手笨脚的。这个过程很痛苦,因为存储库已经相当抽象,并且从 python shell 中可观察到的成员名称不一定出现在 git 子模块代码中。

是否有一个 python 例程可以在检查关键字(例如 print )时执行对象层次结构的图形遍历?(如果没有,我将破解一些 bfs/dfs,在将 __dict__ 、数组、dir() 等内容推送/附加到队列/堆栈之前检查子节点类型。但一定有人来了之前遇到过这个问题并提出了一个更优雅的解决方案。)

--------编辑----------

总而言之,是否有一个现有的库可以让以下代码工作?

import unstable_library
import object_inspecter.search

vk = unstable_library.create() #initializing vk

object_inspecter.search(vk,"print") #searching for lost method

最佳答案

您可以使用相当简单的图形遍历来做到这一点

def find_thing(ob,pattern,seen=set(),name=None,curDepth=0,maxDepth=99,isDict=True):
if(ob is None):
return []
if id(ob) in seen:
return []
seen.add(id(ob))
name = str(name or getattr(ob,"__name__",str(ob)))
base_case = check_base_cases(ob,name,pattern)
if base_case is not None:
return base_case
if(curDepth>=maxDepth):
return []
return recursive_step(ob,pattern,name=name,curDepth=curDepth,isDict=isDict)

现在只需定义您的两个步骤(base_case 和 recursive_step)...类似于

def check_base_cases(ob,name,pattern):
if isinstance(ob,str):
if re.match(pattern,ob):
return [ob]
else:
return []
if isinstance(ob,(int,float,long)):
if ob == pattern or str(ob) == pattern:
return [ob]
else:
return []
if isinstance(ob,types.FunctionType):
if re.match(pattern,name):
return [name]
else:
return []

def recursive_step(ob,pattern,name,curDepth,isDict=True):
matches = []
if isinstance(ob,(list,tuple)):
for i,sub_ob in enumerate(ob):
matches.extend(find_thing(sub_ob,pattern,name='%s[%s]'%(name,i),curDepth=curDepth+1))
return matches
if isinstance(ob,dict):
for key,item in ob.items():
if re.match(pattern,str(key)):
matches.append('%s.%s'%(name,key) if not isDict else '%s["%s"]'%(name,key))
else:
matches.extend(find_thing(item,pattern,
name='%s["%s"]'%(name,key) if isDict else '%s.%s'%(name,key),
curDepth=curDepth+1))
return matches
else:
data = dict([(x,getattr(ob,x)) for x in dir(ob) if not x.startswith("_")])
return find_thing(data,pattern,name=name,curDepth=curDepth+1,isDict=False)

终于可以像这样测试了

print(find_thing(vk,".*print.*"))

我使用了以下示例

class vk(object):
class enabledata:
class camera:
class object2:
def printX(*args):
pass
asynccamera = [object2]
tx = [camera]
toplink = {'enabledata':enabledata}

运行以下命令

print( find_thing(vk,'.*print.*') )
#['vk.toplink["enabledata"].camera.asynccamera[0].printX']

关于python - 搜索Python对象层次结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59315452/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com