0

私は Python についてほとんど何も知りませんが、scons を使用しています。(これを読んでいて、Python は知っているが scons は知らないという人は、おそらく私を助けてくれるでしょう!)

誰かが私を助けて、2 つのリストを含む変数を持つ方法を説明してくれませんか? 構文がわかりません。これは正しいですか?

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 の 2 つのフィールドを持つ単純なクラスを定義したいと思います。

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

追加と拡張の違いはこれです

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

a を使用dictして元のコードと非常によく似たコードを作成できますが、ドットを使用することはできません。見てみましょう:

buildinfo = dict()
buildinfo['objectFiles'] = []
buildinfo['sourceFiles'] = []
buildinfo['objectFiles'].append("Foo")
buildinfo['sourceFiles'].append("Bar")

うまくいきますが、これがあなたが探しているものかどうかはわかりません。

更新された質問について: 2 番目のオブジェクトなしで、2 つのリストを簡単に組み合わせることができます。

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 に答える