0

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

4 回答 4

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

The difference betweeen append and extend is this

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]
于 2009-11-10T16:33:49.443 回答
1

您可以使用 adict使代码与您的原始代码非常相似,但它不会使用点。看一看:

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']
于 2009-11-10T15:33:25.430 回答
1

如果您创建一个单独的类(例如 Oren 的 BuildInfo),那么您当然可以向该类添加一个方法,将数据附加到两个列表中。

class BuildInfo(object):
    def append(self, data):
        self.objectFiles.append(data)
        self.sourceFiles.append(data)
于 2009-11-10T15:50:08.127 回答
0
class BuildInfo(object):
   objectFiles = [];
   sourceFiles = [];

您可以使用以下方法创建:

buildInfo = BuildInfo()

但我不知道如何使附加语法更短或更简洁,除了在对 f() 的调用上添加一些循环。这增加了一种不同的错误倾向。

于 2009-11-10T15:35:23.047 回答