2

こんにちは、クラスのインスタンスを作成し、それに引数値を割り当てようとする次のコードがあります。次のように *args を使用してこれを実行しようとしています:

def main():
    testdata = ['FDR', False, 4, 1933]
    apresident = President(testdata)
    print apresident
    print apresident.alive

class President:
    id_iter = itertools.count(1)
    #def __init__(self, president, alive, terms, firstelected):
    def __init__(self, *args):
        self.id = self.id_iter.next()
        self.president = args[0]
        self.alive = args[1]
        self.terms = args[2]
        self.firstelected = args[3]

「タプル インデックスが範囲外です」というエラーが表示されます。コメント行からわかるように、以前はこれを実現するために位置引数を使用していましたが (これは機能しました)、次のような行を使用して実行していました。

    self.president = president

この場合、*args を使用する正しい方法は何ですか? *kwargs を使用する必要がありますか?

4

3 に答える 3

4

President()リストである に引数を1つだけ渡しています

['FDR', False, 4, 1933]

そのリスト内のアイテムを個別の引数として渡したい場合は、次のようにします。

    apresident = President(*testdata)  # note the * character

パニック大佐が指摘しているように、あなたの例では、引数のアンパッキングの使用は少し無意味です.おそらく実際のユースケースはより複雑であり、その使用を正当化します.

更新

あなたのコメントは実際には別の質問としてより良いフォローアップの質問ですが、:

def main():
    testdata = {
        "president": "FDR",
        "alive": False,
        "terms": 4,
        "firstelected": 1933,
    }
    apresident = President(**testdata)
    anotherpresident = President(president="BHO", terms=2, firstelected=2008)
    print apresident
    print apresident.alive
    print anotherpresident
    print anotherpresident.alive

class President:
    id_iter = itertools.count(1)
    #def __init__(self, president, alive, terms, firstelected):
    def __init__(self, **kwargs):
        self.id = self.id_iter.next()
        self.president = kwargs.get("president", None)
        self.alive = kwargs.get("alive", True)
        self.terms = kwargs.get("president", 1)
        self.firstelected = kwargs.get("president", None)

これは、デフォルト値も定義する方法を示しています。

于 2013-08-24T16:44:20.837 に答える
1

コンストラクターを呼び出すときにリストをアンパックするためにPresident(testdata)行う必要があるときに、を呼び出しています。President(*testdata)

現時点では、基本的に 1 つの引数 (リスト)をIndexError渡しています。args[testdata]testdata


*argsただし、他の回答で述べたように、ここでコンストラクターで使用するのはあまり Pythonic ではありません。どの引数が必要かはわかっているので、そのまま使用してください。

ただし、関数を呼び出すときに使用しても問題ありません。

于 2013-08-24T16:44:28.663 に答える