2009-11-10 30 views
0

我對Python幾乎一無所知,而且我正在使用scons。 (如果你正在閱讀本文,並且知道Python而不是scons,那麼你可能會幫助我!)python/scons help:維護源文件+目標文件列表

有人可以幫我解釋一下如何讓一個變量包含兩個列表?我不確定語法。這是正確的嗎?

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(...)); 

回答

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

的差異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] 
+0

啊,thx澄清append vs. extend – 2009-11-10 17:29:03

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'] 
+0

OK ,它回答了我的一個問題(某些東西的語法包含命名的子字段)。謝謝! – 2009-11-10 15:34:52

+0

我不確定我是否瞭解您的修改。如果你想要結合這兩個列表,我的編輯應該有所幫助。如果你想追加兩個自定義對象,你需要爲它編寫一個類。 – 2009-11-10 15:42:50

+0

是的,我的意思是一個自定義類 – 2009-11-10 16:08:23

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

您可以與創建:

buildInfo = BuildInfo() 

,但我不知道使追加語法縮短或清潔劑,除了增加了一些循環在調用F() 。這增加了一種不同的錯誤傾向性。

1

如果您創建一個單獨的類(例如Oren的BuildInfo),那麼您肯定可以向該類添加一個方法,將數據附加到這兩個列表。

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

這是我想要的,除了「數據」將是一個BuildInfo對象,我不想追加數據到這兩個列表,我想追加數據的objectFiles到appendee的objectFiles,並且sourceFiles也一樣。 – 2009-11-10 16:14:04