我对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(...));
答案 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()的调用上添加一些循环。这增加了一种不同的错误倾向。