处理存储在字典中的依赖项列表

时间:2019-02-05 11:52:54

标签: python dictionary dependencies

我被赋予了编写程序的任务,该程序将处理构建系统的一些配方。这些配方包括依赖项信息。解析所有食谱后,我有一个字典,其中的键是软件包的名称,值是每个直接所依赖的软件包的名称列表。这是此类词典的示例。

{
   'oprofile':[
      'popt',
      'binutils'
   ],
   'qtbuildtools':[

   ],
   'boost-1.65.1':[

   ],
   'boost':[
      'bjam-native',
      'zlib',
      'bzip2'
   ],
   'libuv':[

   ],
   'lvm2':[
      'util-linux'
   ],
   'swupdate':[
      'libconfig',
      'kern-tools-native'
   ],
   'swupdate_tools':[

   ],
   'pdd':[
      'mosquitto',
      'sqlite3',
      'openssl'
   ]
}

我想做的是编写一个函数,该函数将该字典作为输入,然后生成一个类似的字典,但是值将包含,而不仅仅是 direct 依赖项所有每个软件包的依赖项。

这是我为实现目标而完成的解决方案。据我所知,至少不是很好。我想改善它,或者甚至完全走我自己看不见的其他方式。

def _dependencies(bb_files, bb_names):
dep_pairs = []
i = 0

for file in captured_files:
    bbfn = file
    i = i + 1

    with open(captured_files.get(file), encoding="utf-8") as bbfile:
        recipe_cont = bbfile.readlines()
        depes = []

        for rec_line in recipe_cont:
            if rec_line.startswith('DEPENDS'):
                depes = re.sub(r'["\t\n\r\f\v]', '', rec_line.split('=')[1])
                depes = depes.strip()
                depes = re.split(' ', depes)
                for dep in depes:
                    if '\\' or '\\\\' or '$' or '${' or '}' or '/' or '"' in dep:
                        depes.pop(depes.index(dep))
        pair = tuple([bbfn, list(set(depes))])
        dep_pairs.append(pair)
pairs_dict = dict(dep_pairs)

return pairs_dict

def _all_deps_to_build(to_build, all_deps):
    big_list = []
    rec_list = to_build

    for i in itertools.count():
        rec_list1 = []

        for rec in rec_list:

            for key in all_deps:
                if rec in all_deps.get(key):
                    rec_list1.append(key)
                elif re.sub(r'\..*', '', re.sub(r'_.*', '', rec)) in all_deps.get(key):
                    rec_list1.append(key)
        if len(rec_list1) == 0:
            break
        else:
            big_list.extend(rec_list1)
            rec_list = rec_list1

    big_list = set(big_list)  # set() используется для удаления повторов из списка

    return big_list

小解释:_all_deps-to_build()将_dependencies()的输出作为其all_deps输入变量,而to_build只是软件包的简单列表。

我主要关心的是第二个功能。我正在使用itertools,所有这些其他列表似乎都不是正确的方法。

0 个答案:

没有答案