Dataclass - TypeError: 'list' object is not callable

Gerade eben hatte ich ein Stacktrace in einem meiner Programme welches doch einen Moment gedauert hat bis ich herausgefunden hatte was das Problem war.

Sehr vereinfacht sah der Code wie folgt aus (in der Realität hatte das ganze mehr Felder und mehr Attribute und wurde natürlich auch aus einem anderen Modul heraus instanziert).

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
rom dataclasses import dataclass, field
from typing import List


@dataclass
class MyTest:
    somelist: List = field(default_factory=list())


a = MyTest()

Der Fehler lautete dann:

Traceback (most recent call last):
  File "/tmp/mytest.py", line 10, in <module>
    a = MyTest()
  File "<string>", line 3, in __init__
TypeError: 'list' object is not callable

Und ich dachte: Was los? Ich rufe doch gar kein list-Objekt auf ("'list' object not callable"), was willst du eigentlich von mir…
Hier wird doch ganz klar nur eins instanziert in Zeile 7 und was hat das ganze mit Strings zu tun ("TypeError: 'list' object is not callable")?

Der Fehler ist in dieser Zeile:

    somelist: List = field(default_factory=list())

Eine default_factory muss eine Klasse sein, keine Instanz/Objekt, das Feld instanziert ein Objekt dieser Klasse wenn ihm in bei der Instanzierung der Data-Klasse (hier MyTest) kein Wert zugewiesen wird und weißt das Objekt der Variable als Default-Objekt zu.

Richtig muss es also

    somelist: List = field(default_factory=list)

heißen, also ohne () am Ende von list, weil kein Objekt erstellt wird, sondern eine Klasse übergeben.