python / scons help:维护源文件列表+目标文件

时间:2009-11-10 15:27:15

标签: python scons

我对Python几乎一无所知,而且我正在使用scons。 (如果你正在阅读这篇并且知道Python而不是scons,你可以帮助我!)

有人可以帮助我并解释我如何拥有一个包含两个列表的变量吗?我不确定语法。这是对的吗?

buildinfo = // how do you initialize a variable that has fields?
buildinfo.objectFiles = []; // list of the object files
buildinfo.sourceFiles = []; // list of the source files

如果我有一个函数f()返回这个结构的变量,那么将f()的返回值附加到两个列表上的最短方法是什么? (实际上f()是Sconscript(),但没关系。)

// call f() several times and append the results onto buildinfo
buildinfo_sub = f(...);
buildinfo.objectFiles.append(buildinfo_sub.objectFiles);
buildinfo.sourceFiles.append(buildinfo_sub.sourceFiles);
buildinfo_sub = f(...);
buildinfo.objectFiles.append(buildinfo_sub.objectFiles);
buildinfo.sourceFiles.append(buildinfo_sub.sourceFiles);
buildinfo_sub = f(...);
buildinfo.objectFiles.append(buildinfo_sub.objectFiles);
buildinfo.sourceFiles.append(buildinfo_sub.sourceFiles);

有更短的路吗?这不是太长,但它足够容易出错。

编辑:或者更好的是,我想定义一个包含两个字段的简单类,objectFiles和sourceFiles,如果我调用

object1.append(object2)

然后object1会将object2的objectFiles和sourceFiles字段附加到它自己的字段上,所以我可以这样做:

buildinfo = BuildInfo([],[]);
buildinfo.append(f(...));
buildinfo.append(f(...));
buildinfo.append(f(...));

4 个答案:

答案 0 :(得分:2)

这样的事情怎么样:

class BuildInfo(object):
    def __init__(self, objectFiles = [], sourceFiles = []):
        self.objectFiles = objectFiles
        self.sourceFiles = sourceFiles 
    def append(self, build_info):
        self.objectFiles.extend(build_info.objectFiles)
        self.sourceFiles.extend(build_info.sourceFiles)

要使用它,您会说:

a = BuildInfo() #uses default value of an empty list for object/sourceFiles
b = BuildInfo(["hello.dat", "world.dat"], ["foo.txt", "bar.txt"])
a.append(b) #a now has the same info as b
a.append(b) #a now has ["hello.dat", "world.dat", "hello.dat", "world.dat"], ["foo.txt", "bar.txt", "foo.txt", "bar.txt"]

追加和延伸之间的差异是这个

a = [1,2,3]
b = [4,5,6]
a.append(b) #a is now [1,2,3[4,5,6]]

a = [1,2,3]
b = [4,5,6]
a.extend(b) #a is now [1,2,3,4,5,6]

答案 1 :(得分:1)

您可以使用dict使代码与原始代码非常相似,但不会使用点。看看:

buildinfo = dict()
buildinfo['objectFiles'] = []
buildinfo['sourceFiles'] = []
buildinfo['objectFiles'].append("Foo")
buildinfo['sourceFiles'].append("Bar")

它会起作用,但我不确定这是否是您正在寻找的。

关于更新的问题: 您可以轻松组合两个列表,而无需第二个对象。

allobjects = []
objs1 = ["foo", "bar"]
objs2 = ["baz", "bam"]

allobjects.extend(objs1) # ['foo', 'bar']
allobjects.extend(objs2) # ['foo', 'bar', 'baz', 'bam']

答案 2 :(得分:1)

如果您创建一个单独的类(例如Oren的BuildInfo),那么您当然可以向该类添加一个方法,将数据附加到两个列表。

class BuildInfo(object):
    def append(self, data):
        self.objectFiles.append(data)
        self.sourceFiles.append(data)

答案 3 :(得分:0)

class BuildInfo(object):
   objectFiles = [];
   sourceFiles = [];

你可以用:

创建
buildInfo = BuildInfo()

但我不知道如何使附加语法更短或更清晰,除了在对f()的调用上添加一些循环。这增加了一种不同的错误倾向。