题
我知道旁边没有关于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()更短或清洁剂,其它。这增加了不同种类的容易出错的烦躁的。
不隶属于 StackOverflow