Python / scons help: ведение списков исходных файлов + объектных файлов - PullRequest
0 голосов
/ 10 ноября 2009

Я почти ничего не знаю о 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);

Есть ли более короткий путь? это не слишком долго, но достаточно долго, чтобы быть подверженным ошибкам.

edit : или еще лучше, я хочу определить простой класс, который имеет два поля, objectFiles и sourceFiles, и если я вызову

object1.append(object2)

тогда object1 добавит поля objectFiles и sourceFiles объекта2 к своим собственным, поэтому я мог бы просто сделать:

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

Ответы [ 4 ]

2 голосов
/ 10 ноября 2009

Как насчет этого:

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 голос
/ 10 ноября 2009

Если вы создаете отдельный класс (например, BuildInfo от Oren), тогда вы, безусловно, можете добавить к этому классу метод, который добавляет данные в оба списка.

class BuildInfo(object):
    def append(self, data):
        self.objectFiles.append(data)
        self.sourceFiles.append(data)
1 голос
/ 10 ноября 2009

Вы можете использовать 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 голосов
/ 10 ноября 2009
class BuildInfo(object):
   objectFiles = [];
   sourceFiles = [];

, который вы можете создать с помощью:

buildInfo = BuildInfo()

но я не знаю, как сделать добавленный синтаксис короче или чище, кроме добавления некоторых циклических вызовов f () который добавляет другой тип склонности к ошибкам.

...