我知道旁边没有关于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和来源的简单类,如果我称之为

object1.append(object2)

然后object1将对象2的objectFiles和来源字段追加到它自己的,所以我只是做:

buildinfo = BuildInfo([],[]);
buildinfo.append(f(...));
buildinfo.append(f(...));
buildinfo.append(f(...));
有帮助吗?

解决方案

如何是这样的:

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"]

的差异betweeen追加和延伸是这

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]

其他提示

您可以使用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']

如果创建一个单独的类(例如奥伦的BuildInfo),则可以肯定一个方法添加到类数据追加到两个列表。

class BuildInfo(object):
    def append(self, data):
        self.objectFiles.append(data)
        self.sourceFiles.append(data)
class BuildInfo(object):
   objectFiles = [];
   sourceFiles = [];

您可以与创建:

buildInfo = BuildInfo()

,但我不知道使追加的语法比加入一些循环通过调用至f()更短或清洁剂,其它。这增加了不同种类的容易出错的烦躁的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top