[解決済み] データクラスは、なぜクラス属性宣言で変更可能なデフォルトを持つことができないのですか?
2023-02-17 05:08:55
質問
これは は は、以前にも質問されたことがあるような気がしますが、1 時間ほど検索しても結果は得られませんでした。 データクラスにデフォルトのリスト引数を渡す は有望に見えましたが、私が探しているものではありません。
ここに問題があります: クラス属性に変更可能な値を割り当てようとすると、エラーが発生します。
@dataclass
class Foo:
bar: list = []
# ValueError: mutable default <class 'list'> for field a is not allowed: use default_factory
エラーメッセージから察するに、代わりに以下のようにすればいいようです。
@dataclass
class Foo:
bar: list = field(default_factory=list)
しかし、なぜ変更可能なデフォルトは許されないのでしょうか?それは 変更可能なデフォルトの引数の問題 ?
どのように解決するのですか?
私の疑問は、かなり明確に ドキュメント (から派生したものです)。 PEP 557 から派生したものです)。
Pythonはメンバー変数のデフォルト値をクラス属性に保存します。データクラスを使用しないこの例を考えてみましょう。
class C: x = [] def add(self, element): self.x.append(element) o1 = C() o2 = C() o1.add(1) o2.add(2) assert o1.x == [1, 2] assert o1.x is o2.x
クラスの2つのインスタンス
C
は同じクラス変数x
は、予想通りデータクラスを使用して、このコードが有効であった場合。
@dataclass class D: x: List = [] def add(self, element): self.x += element
のようなコードが生成されるでしょう。
class D: x = [] def __init__(self, x=x): self.x = x def add(self, element): self.x += element
これは、元の例と同じ問題で、クラス
C
. つまり、2つのクラスD
に値を指定しないx
を指定しなかった場合、クラスインスタンスの作成時にx
. データクラスは通常のPythonのクラス作成を使用するだけなので、彼らもこの動作を共有します。データクラスがこの状態を検出する一般的な方法はありません。その代わりに、データクラスはValueError
型のデフォルトパラメータを検出した場合list
,dict
またはset
. これは部分的な解決策ですが、多くの一般的なエラーから保護することができます。
関連
-
[解決済み] Pythonのキャッシュライブラリはありますか?
-
[解決済み] Pythonのargparseを使った隠し引数の作成
-
[解決済み] Django 1.7で初期マイグレーションからマイグレートバックする方法は?
-
[解決済み] Ctrl-CでPythonスクリプトを終了できない
-
[解決済み] サブフォルダからのインポートモジュール
-
[解決済み] Pythonでマルチプロセッシングキューを使うには?
-
[解決済み] djangoフレームワークでフォームフィールドから値を取得するには?
-
[解決済み] virtualenvsはどこに作成するのですか?
-
[解決済み] 単純な文字列からtimedeltaオブジェクトを作成する方法
-
[解決済み] Alembicアップグレードスクリプトでインサートやアップデートを実行するにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 最小限の驚き」と「変更可能なデフォルトの引数
-
[解決済み] 2つの線分が交差しているかどうかを確認するにはどうすればよいですか?
-
[解決済み] Djangoで2つの日付の間を選択する
-
[解決済み] Jupyter (IPython)ノートブックのセッションをpickleして保存する方法
-
[解決済み] 異なる順序で同じ要素を持つ2つのJSONオブジェクトを等しく比較するには?
-
[解決済み] Python Logging でログメッセージが2回表示される件
-
[解決済み] PyQtアプリケーションのスレッド化。QtスレッドとPythonスレッドのどちらを使うか?
-
[解決済み] djangoフレームワークでフォームフィールドから値を取得するには?
-
[解決済み] 単純な文字列からtimedeltaオブジェクトを作成する方法
-
[解決済み] PythonのRequestsモジュールを使ってWebサイトに "ログイン "するには?