使用*args调用python函数的次数未定义



我定义了一个函数createDictionary,它接受一个文件,从该文件中提取键,并使用这些键为矩阵中的数据值编制索引。然后返回它,将索引用作键,并将值作为python字典中的值检索。

我的目标是编写一个getData函数,它将根据用户传递给它的矩阵和其他参数的数量来调用和运行createDictionary一定次数。

def getData(bedfile, matrix1, start1, end1, matrix2, start2, end2, matrix3, start3, end3, bedfilesep = "t", matrixsep = "t"):
    x = createDictionary(bedfile, matrix1, start1, end1, bedfilesep, matrixsep)
    y = createDictionary(bedfile, matrix2, start2, end2, bedfilesep, matrixsep)
    z = createDictionary(bedfile, matrix3, start3, end3, bedfilesep, matrixsep)
    x.update(y)
    x.update(z)
    return x.values()

理想情况下,我可以传递任意数量的matrix#start#end#参数,并针对这些参数的出现次数运行此函数。

实际上您想要使用不同的数据结构。每当你发现自己定义了x1,x2,x3。。。x913等,请考虑使用列表!

函数看起来是这样的:

def getData(bedfile, matrixlist, bedfilesep = "t", matrixsep = "t"):
  x = createDictionary(bedfile, matrixlist[0][0], matrixlist[0][1], matrixlist[0][2], bedfilesep, matrixsep)
  y = createDictionary(bedfile, matrixlist[1][0], matrixlist[1][1], matrixlist[1][2], bedfilesep, matrixsep)
  z = createDictionary(bedfile, matrixlist[2][0], matrixlist[2][1], matrixlist[2][2], bedfilesep, matrixsep)
  ...

并且您需要将矩阵打包到列表中,例如将它们存储在元组中:

mylist = []
mylist.append((m1, s1, e1))
mylist.append((m12, 12, 33))

然后你可以通过调用一次通过整个列表

getData(bedfile, mylist)

它应该像传递参数list一样简单,所以

getData(bedfile, matrix1, ... , matrix2, ...)

将成为

getData(bedfile, [matrix1, matrix2], ....)

然后在getData函数中,您可以将这些作为处理

x = {}
for matrix, start, end in zip(matrices, starts, ends):
    x.update(createDictionary(bedfile, matrix, start, end, bedfilesep, matrixsep)

考虑将它们作为矩阵、开始和结束的三个单独列表,或这三个列表的元组三元组列表传入。然后使用for循环或列表理解来运行它们中的每一组。将*args**kwargs用于无序、异构的参数列表似乎并不理想。

最新更新