1

次のようなクラス階層があります。

class ContextSummary(object):
    def __init__(self, id, db):
        self.db = db
        self.id = id

class GroupContextSummary(ContextSummary):
    def __init__(self, gId, db = {}):
        super(GroupContextSummary, self).__init__(gId, db)

GroupContextSummaryunittest で 2 番目のパラメーターのないクラスを複数回使用します。

groupSummary = GroupContextSummary(gId)

問題は、データベースがまだ以前の実行値を保持していることです。これを防ぐために、私は使用しなければなりませんでした

groupSummary = GroupContextSummary(gId, {})

または、init メソッドを次のように再定義する必要がありました。

def __init__(self, gId, db = None):
    if db is None: db = {}
    super(GroupContextSummary, self).__init__(gId, db)

何が間違っている可能性がありますか?

4

2 に答える 2

1

変更可能なオブジェクトを関数に渡すときはいつでも、コンテンツに変更を加えようとしている場合は、すぐにそのコピーを作成する必要があります。これは、関数だけでなく、すべての関数に当てはまり__init__ます。引数にデフォルトさえない場合も同様です。

の行を次のように置き換える必要がありますContextSummary

self.db = db.copy()

渡されたオブジェクトを変更するつもりはなかったと思います。関数の意図がそのパラメーターを変更することである場合、デフォルトを持つことは意味がありませんか?

于 2013-06-07T21:02:06.173 に答える
1

Python のデフォルトに関する一般的な問題。デフォルトは、関数が呼び出されたときではなく、関数の定義時に割り当てられます。 1つの解決策はこれを行うことです:

def func(a, b=None):
    if not b:
        b = {}

明らかに、None が b の正当な引数である場合、B のデフォルトとして None を使用したくありません。おっと。あなたはすでにそれを知っていました。

于 2013-06-07T20:26:47.537 に答える